将数组的数据集转换为DataFrame

时间:2019-05-21 09:38:42

标签: scala apache-spark apache-spark-sql

给出Dataset[Array[String]]。 实际上,此结构具有数组类型的单个字段。 是否有可能将每个数组项放在单独的列中将其转换为DataFrame

如果我有RDD[Array[String]],我可以通过以下方式实现它:

val rdd: RDD[Array[String]] = ???
rdd.map(arr => Row.fromSeq(arr))

但是令人惊讶的是,我无法对Dataset[Array[String]]做同样的事情–它表示Row没有编码器。

而且我不能用Tuplecase class替换数组,因为在编译时数组的大小是未知的。

2 个答案:

答案 0 :(得分:1)

在这里您可以执行foldLeft来手动创建所有列。

val df = Seq(Array("Hello", "world"), Array("another", "row")).toDS()

然后您计算数组的大小。

val size_array = df.first.length

然后使用foldLeft将列添加到数据框中:

0.until(size_array).foldLeft(df){(acc, number) => df.withColumn(s"col$number", $"value".getItem(number))}.show

这是我们的累加器,是我们的df,我们只逐列添加列。

答案 1 :(得分:1)

如果数组的大小相同,则可以使用“选择”:

kubectl get services -l component=controller,app=nginx-ingress -o jsonpath="{.items[0].status.loadBalancer.ingress[0].ip}"

输出:

val original: Dataset[Array[String]] = Seq(Array("One", "Two"), Array("Three", "Four")).toDS()
val arraySize = original.head.size
val result = original.select(
  (0 until arraySize).map(r => original.col("value").getItem(r)): _*)
result.show(false)