如何将火花数据帧数组转换为元组

Posted

技术标签:

【中文标题】如何将火花数据帧数组转换为元组【英文标题】:How to convert spark dataframe array to tuple 【发布时间】:2019-08-19 03:55:57 【问题描述】:

如何在 scala 中将 spark 数据帧转换为 2 的元组?

我尝试在前导函数的帮助下分解数组并创建一个新列,以便我可以使用两列来创建元组。

为了使用前导功能,我需要一列作为排序依据,我没有。 请提出解决此问题的最佳方法?

注意:我需要在数组中保留相同的顺序。

例如:

输入

例如,输入看起来像这样,

id1 | [text1, text2, text3, text4]

id2 | [txt, txt2, txt4, txt5, txt6, txt7, txt8, txt9]

预期 o/p: 我需要得到长度为 2 的元组的输出

id1 |  [(text1, text2), (text2, text3), (text3,text4)]

id2 |  [(txt, txt2), (txt2, txt4), (txt4, txt5), (txt5, txt6), (txt6, txt7), (txt7, txt8), (txt8, txt9)]

【问题讨论】:

【参考方案1】:

您可以使用sliding 窗口函数创建一个udf 来创建元组列表

val df = Seq(
  ("id1", List("text1", "text2", "text3", "text4")),
  ("id2", List("txt", "txt2", "txt4", "txt5", "txt6", "txt7", "txt8", "txt9"))
).toDF("id", "text")

val sliding = udf((value: Seq[String]) => 
  value.toList.sliding(2).map  case List(a, b) => (a, b) .toList
)

val result = df.withColumn("text", sliding($"text"))

输出:

+---+-------------------------------------------------------------------------------------------------+
|id |text                                                                                             |
+---+-------------------------------------------------------------------------------------------------+
|id1|[[text1, text2], [text2, text3], [text3, text4]]                                                 |
|id2|[[txt, txt2], [txt2, txt4], [txt4, txt5], [txt5, txt6], [txt6, txt7], [txt7, txt8], [txt8, txt9]]|
+---+-------------------------------------------------------------------------------------------------+

希望这会有所帮助!

【讨论】:

以上是关于如何将火花数据帧数组转换为元组的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 将数据帧转换为元组数组

Swift将数组转换为元组数组

如何创建将二叉树转换为元组的函数?

如何将字典转换为元组列表?

将 Scala 列表转换为元组?

将数据框转换为元组列表