将 RDD[String] 转换为数据帧

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] 转换为带有标头的数据帧的解决方案都会非常好。

提前致谢。

GMc*_*GMc 5

您还可以通过以下方式实现此结果:

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)

我希望这有帮助。