[Scala] 关于org.apache.spark.sql.Row

背景

Row(Catalyst Row)表示关系运算符的一行输出。它是一个通用行对象,具有有序的字段集合,可以通过索引(generic access by ordinal),字段名(primitive access)或使用Scala的模式匹配来访问。
要创建新Row,请在Java中使用RowFactory.create()或在Scala中使用Row.apply()。

构造Row

Row的伴生对象提供工厂方法,可以从元素集合(apply),元素序列(fromSeq)和元组(fromTuple)创建Row实例。

import org.apache.spark.sql.Row

// Create a Row from values.
scala> Row(1, "hello")
res0: org.apache.spark.sql.Row = [1,hello]

// by apply
scala> Row.apply(1, "hello")
res0: org.apache.spark.sql.Row = [1,hello]

// Created a Row from a Seq of values.
scala> Row.fromSeq(Seq(1, "hello"))
res1: org.apache.spark.sql.Row = [1,hello]

// Created a Row from a Tuple of values.
scala> Row.fromTuple((0, "hello"))
res2: org.apache.spark.sql.Row = [0,hello]

解析Row值

一般来说,我们可以通过索引(generic access by ordinal)的通用访问来访问Row值

import org.apache.spark.sql.Row

scala> val row = Row(1, true, "a string", null)
row: org.apache.spark.sql.Row = [1,true,a string,null]

// by index
scala> val firstValue = row(0)
firstValue: Any = 1

scala> val fourthValue = row(3)
fourthValue: Any = null

// by get
scala> val firstValue = row.get(0)
firstValue: Any = 1

scala> val fourthValue = row.get(3)
fourthValue: Any = null

// by apply
scala> val firstValue = row.apply(0)
firstValue: Any = 1

scala> val fourthValue = row.apply(3)
fourthValue: Any = null

按顺序进行的通用访问(使用索引、apply或get)返回Any类型的值。可以使用带索引的getAs查询具有适当类型的字段。

val row = Row(1, "hello")

scala> row.getAs[Int](0)
res1: Int = 1

scala> row.getAs[String](1)
res2: String = hello

Row与模式匹配

而在Scala中,还可以在模式匹配中提取Row对象中的字段。 例子如下:

scala> val res4= Row(1, "hello") match { 
  case Row(key: Int, value: String) =>
  key -> value
}
res4: (Int, String) = (1,hello)

参考资料

Row (Spark 2.4.3 JavaDoc)
Row · The Internals of Spark SQL

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解了您的要求。下面是Scala代码实现RDD转DataFrame,并对ratings.csv文件进行分析的示例: ```scala import org.apache.spark.sql.{DataFrame, SparkSession} import org.apache.spark.sql.types.{IntegerType, LongType, StructField, StructType} object RatingsAnalysis { def main(args: Array[String]): Unit = { val spark = SparkSession.builder() .appName("RatingsAnalysis") .master("local[*]") .getOrCreate() // 读取ratings.csv文件并转成RDD val ratingsRDD = spark.sparkContext.textFile("ratings.csv") .map(line => line.split(",")) .map(fields => (fields(0).toInt, fields(1).toInt, fields(2).toFloat)) // 构建DataFrame的schema val schema = StructType( List( StructField("userId", IntegerType, nullable = false), StructField("movieId", IntegerType, nullable = false), StructField("rating", FloatType, nullable = false) ) ) // 将RDD转成DataFrame val ratingsDF = spark.createDataFrame(ratingsRDD.map(row => Row.fromTuple(row)), schema) // 注册成表 ratingsDF.createOrReplaceTempView("ratings") // 选择一部分数据进行分析 val analysisResult = spark.sql("SELECT movieId, AVG(rating) AS avg_rating, COUNT(*) AS num_ratings FROM ratings WHERE userId <= 50 GROUP BY movieId ORDER BY avg_rating DESC LIMIT 10") analysisResult.show() spark.stop() } } ``` 在这个示例中,我们读取了ratings.csv文件并将其转成了RDD。然后,我们定义了一个DataFrame的schema,将RDD转成DataFrame,并注册成表。最后,我们使用Spark SQL对表进行了查询分析,选择了userId小于等于50的数据,并按照电影的平均评分进行降序排序,最后只显示前10条结果。 这个示例只是一个简单的分析,您可以根据自己的需求进行更复杂的分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值