给出Dataset[Array[String]]
。
实际上,此结构具有数组类型的单个字段。
是否有可能将每个数组项放在单独的列中将其转换为DataFrame
?
如果我有RDD[Array[String]]
,我可以通过以下方式实现它:
val rdd: RDD[Array[String]] = ???
rdd.map(arr => Row.fromSeq(arr))
但是令人惊讶的是,我无法对Dataset[Array[String]]
做同样的事情–它表示Row
没有编码器。
而且我不能用Tuple
或case class
替换数组,因为在编译时数组的大小是未知的。
答案 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)