想象一下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传递,但我不想要精确任何模式。
答案 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)))
)
但我不想要精确的任何架构。
你真的无能为力。 DataFrames
需要架构。它可以显式地提供为DataType
,也可以通过反射隐式提供,并且具有未知数量的列,您需要大量的元编程魔法,以便在运行时生成所需的案例类。
相关: