scala - 如何在spark中将rdd对象转换为dataframe

标签 scala apache-spark apache-spark-sql rdd

如何将 RDD (org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]) 转换为 Dataframe org.apache.spark。 sql.DataFrame。我使用 .rdd 将数据帧转换为 rdd。处理后我希望它回到数据框中。我该如何做到这一点?

最佳答案

此代码在 Spark 2.x 和 Scala 2.11 中完美运行

导入必要的类

import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types.{DoubleType, StringType, StructField, StructType}

创建SparkSession对象,这是 spark

val spark: SparkSession = SparkSession.builder.master("local").getOrCreate
val sc = spark.sparkContext // Just used to create test RDDs

让我们 RDD做到DataFrame

val rdd = sc.parallelize(
  Seq(
    ("first", Array(2.0, 1.0, 2.1, 5.4)),
    ("test", Array(1.5, 0.5, 0.9, 3.7)),
    ("choose", Array(8.0, 2.9, 9.1, 2.5))
  )
)

##方法1 使用SparkSession.createDataFrame(RDD obj) .

val dfWithoutSchema = spark.createDataFrame(rdd)

dfWithoutSchema.show()
+------+--------------------+
|    _1|                  _2|
+------+--------------------+
| first|[2.0, 1.0, 2.1, 5.4]|
|  test|[1.5, 0.5, 0.9, 3.7]|
|choose|[8.0, 2.9, 9.1, 2.5]|
+------+--------------------+

##方法2 使用SparkSession.createDataFrame(RDD obj)并指定列名称。

val dfWithSchema = spark.createDataFrame(rdd).toDF("id", "vals")

dfWithSchema.show()
+------+--------------------+
|    id|                vals|
+------+--------------------+
| first|[2.0, 1.0, 2.1, 5.4]|
|  test|[1.5, 0.5, 0.9, 3.7]|
|choose|[8.0, 2.9, 9.1, 2.5]|
+------+--------------------+

##方法3(问题的实际答案) 这种方式需要输入rdd类型应为 RDD[Row] .

val rowsRdd: RDD[Row] = sc.parallelize(
  Seq(
    Row("first", 2.0, 7.0),
    Row("second", 3.5, 2.5),
    Row("third", 7.0, 5.9)
  )
)

创建架构

val schema = new StructType()
  .add(StructField("id", StringType, true))
  .add(StructField("val1", DoubleType, true))
  .add(StructField("val2", DoubleType, true))

现在应用 rowsRddschemacreateDataFrame()

val df = spark.createDataFrame(rowsRdd, schema)

df.show() 
+------+----+----+
|    id|val1|val2|
+------+----+----+
| first| 2.0| 7.0|
|second| 3.5| 2.5|
| third| 7.0| 5.9|
+------+----+----+

关于scala - 如何在spark中将rdd对象转换为dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29383578/

相关文章:

scala - 如果定义了选项,则用于在链中应用函数的惯用 Scala

java - Amazon S3 客户端未列出存储桶中的所有文件夹

java - 简单手机号码的正则表达式(Scala 风格)

apache-spark - databricks 集群中的通用元数据

scala - 无法使用 Mesos 运行 Spark

apache-spark - var hFile = sc.textFile ("hdfs://localhost:9000/ex1/cen.csv") 输入路径不存在错误

apache-spark - 使用 extraOptimizations 转换 Spark SQL AST

multithreading - 如何保持在内存的范围内

maven - 哪个 jar 包含 org.apache.spark.sql.api.java.JavaSQLContext

mongodb - 使用 Mongodb 的 Spark 非常慢