使用不同数量的列生成Dataframe

时间:2018-05-13 08:35:27

标签: scala apache-spark spark-dataframe

想象一下csv如下:

a,b,c,d
1,1,0,0
0,1,1,0
...

我想自动获得一个包含4列a,b,c,d。

的DF

手动技术可以是:

val rdd = sc.textFile(path).map(_.split(","))
val cols = (0 until rdd.first.size).map(_.toString).toArray
val df = rdd.map{ case Array(a, b, c, d) => (a, b, c, d) }.toDF(cols:_*)

这种技术的问题在于我必须手动精确地确定a,b,c,d列的数量,这些列可能存在数百个或更多特征的问题。

我认为它存在一个更有用的方法,可能通过sparkSession传递,但我不想要精确任何模式。

2 个答案:

答案 0 :(得分:1)

Spark可以在读取数据文件时自动推断出架构。如果您有包含标题的CSV文件,则可以使用

val df = spark.read.option("header", "true").csv(path)

根据您的示例,它会导致(使用df.show()):

+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+
|  1|  1|  0|  0|
|  0|  1|  1|  0|
+---+---+---+---+

答案 1 :(得分:0)

您可以使用Row和架构:

import org.apache.spark.sql.Row
import org.apache.spark.sql.types._

val header = rdd.first

spark.createDataFrame(
  rdd.map(row => Row.fromSeq(row.take(header.size))), 
  StructType(header map (StructField(_, StringType)))
)

但是,just use Spark CSV reader

  

但我不想要精确的任何架构。

你真的无能为力。 DataFrames需要架构。它可以显式地提供为DataType,也可以通过反射隐式提供,并且具有未知数量的列,您需要大量的元编程魔法,以便在运行时生成所需的案例类。

相关: