scala – 如何自动化StructType创建以将RDD传递给DataFrame

我想将RDD保存为镶木地板文件.为此,我将RDD传递给DataFrame,然后使用结构将DataFrame保存为镶木地板文件:

val aStruct = new StructType(Array(StructField("id",StringType,nullable = true),StructField("role",nullable = true)))
    val newDF = sqlContext.createDataFrame(filtered,aStruct)

问题是如何为所有列自动创建一个Struct,假设它们都是StringType?另外,nullable = true是什么意思?这是否意味着所有空值都将被Null取代?

解决方法

为什么不使用内置的toDF?

scala> val myRDD = sc.parallelize(Seq(("1","roleA"),("2","roleB"),("3","roleC")))
myRDD: org.apache.spark.rdd.RDD[(String,String)] = ParallelCollectionRDD[60] at parallelize at <console>:27

scala> val colNames = List("id","role")
colNames: List[String] = List(id,role)

scala> val myDF = myRDD.toDF(colNames: _*)
myDF: org.apache.spark.sql.DataFrame = [id: string,role: string]

scala> myDF.show
+---+-----+
| id| role|
+---+-----+
|  1|roleA|
|  2|roleB|
|  3|roleC|
+---+-----+

scala> myDF.printSchema
root
 |-- id: string (nullable = true)
 |-- role: string (nullable = true)

scala> myDF.write.save("myDF.parquet")

nullable = true只表示指定的列可以包含空值(这对于通常没有空值的int列很有用–Innt没有NA或null).

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...