max*_*ano 1 scala dataframe apache-spark rdd
我有一个带有这种形式的 RDD[String]:
VAR1,VAR2,VAR3,VAR4, ...
a , b , c , d , ...
e , f , g , h , ...
Run Code Online (Sandbox Code Playgroud)
这意味着第一行是我的标题逗号分隔,所有以下行都是我的数据,也是逗号分隔。
我的目的是将该非结构化 RDD 转换为这样的 DataFrame:
_____________________
|VAR1|VAR2|VAR3|VAR4|
|----|----|----|----|
| a | b | c | d |
| e | f | g | h |
Run Code Online (Sandbox Code Playgroud)
我尝试使用 toDF() 方法,它将 RDD[tuples] 转换为 Dataframe。但是从 RDD[String] 到 RDD[tuples] 的转换对于我的变量数量(超过 200 个)来说听起来不切实际。
另一种解决方案应该是使用该方法
sqlContext.createDataFrame(rdd, schema)
Run Code Online (Sandbox Code Playgroud)
这需要将我的 RDD[String] 转换为 RDD[Row] 并将我的标题(RDD 的第一行)转换为模式:StructType,但我不知道如何创建该模式。
任何将 RDD[String] 转换为带有标头的数据帧的解决方案都会非常好。
提前致谢。
您还可以通过以下方式实现此结果:
val data = Seq(
("VAR1, VAR2, VAR3, VAR4"),
("a, b, c, d"),
("ae, f, g, h")
)
val dataDS = sc.parallelize(data).toDS
val result = spark.read.option("inferSchema","true").option("header","true").csv(dataDS)
result.printSchema
result.show
Run Code Online (Sandbox Code Playgroud)
上面的输出是:
root
|-- VAR1: string (nullable = true)
|-- VAR2: string (nullable = true)
|-- VAR3: string (nullable = true)
|-- VAR4: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)
和
+----+-----+-----+-----+
|VAR1| VAR2| VAR3| VAR4|
+----+-----+-----+-----+
| a| b| c| d|
| ae| f| g| h|
+----+-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)
如果您的数据在其中一列(不包括标题)中有数字,那么“inferSchema”应该正确地将该列推断为数字类型。例如,使用它作为输入数据:
val data = Seq(
("VAR1, VAR2, VAR3, VAR4"),
("a, 1, c, d"),
("ae, 10, g, h")
)
Run Code Online (Sandbox Code Playgroud)
输出将是:
root
|-- VAR1: string (nullable = true)
|-- VAR2: double (nullable = true)
|-- VAR3: string (nullable = true)
|-- VAR4: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)
和
+----+-----+-----+-----+
|VAR1| VAR2| VAR3| VAR4|
+----+-----+-----+-----+
| a| 1.0| c| d|
| ae| 10.0| g| h|
+----+-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
1705 次 |
| 最近记录: |