当前位置: 首页 > 知识库问答 >
问题:

包含数组的Java spark数据帧联接列

胡俊贤
2023-03-14

我有两个数据帧df1和df2。df1有一个String类型的列键

df1.show()

key
----
k1
k2
k3

df2 has 2 columns
df2.show()
topic | keys
-------------
 t1  | [k1, k2]
 t2  | [pk1, pk2]

当df1.key出现在df2.keys中时,我想连接2个数据帧

然而,我正在寻找一个完整的单词匹配。Contains方法连接部分匹配的行。我的意思是,在上面的示例中,我不希望k2与[pk1,pk2]连接,因为数组不包含密钥k2,它包含pk2。

有人能建议如何加入这个案子吗?请用JAVA提供示例。

共有2个答案

柯耀
2023-03-14

你可以做的是分解数组,每个键得到一行,如下所示:

df2 = df2.withColumn("key", explode(df2.col("keys")))
df2.show()

+-----+----------+---+
|topic|      keys|key|
+-----+----------+---+
|   t1|  [k1, k2]| k1|
|   t1|  [k1, k2]| k2|
|   t2|[pk1, pk2]|pk1|
|   t2|[pk1, pk2]|pk2|
+-----+----------+---+

然后,您可以加入此新列:

Dataset<Row> result = df2.join(key, df2.col("key").equalTo(df1.col("key")), "inner")
result.show()

+-----+--------+---+---+
|topic|    keys|key|key|
+-----+--------+---+---+
|   t1|[k1, k2]| k1| k1|
|   t1|[k1, k2]| k2| k2|
+-----+--------+---+---+

请注意,它不是很有效,因为它重复了数据。

洪和风
2023-03-14

可以使用函数“数组包含”:

val df1 = List("k1", "k2", "k3").toDF("key")
val df2 = List(
  ("t1", Array("k1", "k2")),
  ("t2", Array("pk1", "pk2"))
).toDF("topic", "keys")
val result = df1.join(df2, expr("array_contains(keys,key)"))
result.show(false)

输出:

+---+-----+--------+
|key|topic|keys    |
+---+-----+--------+
|k1 |t1   |[k1, k2]|
|k2 |t1   |[k1, k2]|
+---+-----+--------+
 类似资料:
  • 我有两个数据帧df1(Employee表) 和 在我连接了df1.dept_id和df2.id上的这两个表之后: 同时将其保存在文件中, 它给出错误: 我读过有关使用字符串序列来避免列重复的信息,但这适用于要对其执行连接的列。我需要对未连接的列具有类似的功能。 有没有一种直接的方法可以将重复列嵌入表名以便保存? 我想出了一个解决方案,匹配两个df的列,并重命名重复的列,将表名附加到列名上。但是有直

  • 问题内容: 我有一个如下所示的pandas数据框,并通过一列保存数据组: 现在,我想创建新的数据框(名为df_w,df_x,df_y,df_z),这些数据框仅保存其原始数据中的数据,并在一些可迭代的列表(例如列表)中进行最佳组合: 有没有使用groupby,apply和/或applymap和函数来实现此目的的智能(矢量化熊猫)方法? 我当时正在考虑对数据框进行迭代,但这似乎不是很优雅。 预先感谢您

  • 我有一个包含几个pandas数据帧(由键标识)的dict,任何有效序列化(和干净加载)它的建议。下面是结构(一个pprint显示输出)。每个DICT['method_x_']['meas_x_']都是一个pandas数据帧。我们的目标是保存数据流,以便使用一些特定的绘图选项进行进一步的绘图。 {“Method1”: {“Meas1”: “方法2”: {“Meas1”: “Meas2”:

  • 我有一个数据帧,它有一个数组类型的复杂列数据类型

  • 我有简单的实体: “guard”是来自同一实体的另一个用户的id。我必须使用简单表格渲染视图: 我试图通过询问来做到这一点: 但它只给我id和用户名,没有连接数据。我知道整个查询应该是这样的: 但我找不到通过QueryBuilder实现该功能,然后在twig模板中访问该功能的方法。 当做

  • 我正在尝试在 pyspark 中连接两个数据帧,但将一个表作为数组列连接在另一个表上。 例如,对于这些表: 我想在列和上将df1连接到df2,但和应该是单个数组类型列。此外,应保留所有名称。新数据框的输出应该能够转换为此json结构(例如前两行): 任何关于如何实现这一目标的想法都将不胜感激! 谢谢, 卡罗莱纳州