Scala Spark:动态分割数据帧列

Jak*_*ke 1 scala apache-spark

我对 scala 和 Spark 很陌生。

我已将文本文件读入数据帧,并成功将单列拆分为列(本质上该文件是空格分隔的 csv)

  val irisDF:DataFrame = spark.read.csv("src/test/resources/iris-in.txt")

  irisDF.show()

  val dfnew:DataFrame = irisDF.withColumn("_tmp", split($"_c0", " ")).select(
    $"_tmp".getItem(0).as("col1"),
    $"_tmp".getItem(1).as("col2"),
    $"_tmp".getItem(2).as("col3"),
    $"_tmp".getItem(3).as("col4")
  ).drop("_tmp")
Run Code Online (Sandbox Code Playgroud)

这有效。

但是如果我不知道数据文件中有多少列怎么办?如何根据 split 函数生成的项目数动态生成列?

Psi*_*dom 5

您可以创建一系列选择表达式,然后将它们全部应用于select具有语法的方法:_*

示例数据

val df = Seq("a b c d", "e f g").toDF("c0")

df.show
+-------+
|     c0|
+-------+
|a b c d|
|  e f g|
+-------+
Run Code Online (Sandbox Code Playgroud)

如果您想要从列中选择五列c0,则需要在执行此操作之前确定:

val selectExprs = 0 until 5 map (i => $"temp".getItem(i).as(s"col$i"))

df.withColumn("temp", split($"c0", " ")).select(selectExprs:_*).show
+----+----+----+----+----+
|col0|col1|col2|col3|col4|
+----+----+----+----+----+
|   a|   b|   c|   d|null|
|   e|   f|   g|null|null|
+----+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)