我有两个数据。
df1= sqlContext.createDataFrame([("A001","RED, WHITE, BLUE"),("A002","RED, YELLOW"),("A003","GREEN,RED"),("A004","WHITE,YELLOW")], ["id","csv_column"])
df1.show()
df2= sqlContext.createDataFrame([("C1","RED"),("C2","WHITE"),("C3","BLUE"),("C4","YELLOW"),("C5","RED"),("C6","GREEN"),("C7","BLUE")], ["CLRCODE","COLOR"])
df2.show()
+----+----------------+
| id | csv_column |
+----+----------------+
|A001|RED, WHITE, BLUE|
|A002|RED, YELLOW |
|A003|GREEN, RED |
|A004|WHITE, YELLOW |
+----+----------------+
+-------+-------+
|CLRCODE| COLOR |
+-------+-------+
| C1 | RED |
| C2 | WHITE |
| C3 | BLUE |
| C4 | YELLOW|
| C5 | RED |
| C6 | GREEN |
| C7 | BLUE |
+-------+-------+
+-------+
|df1.id |
+-------+
|A001 |
|A002 |
|A003 |
|A001 |
|A004 |
|A001 |
|A002 |
|A004 |
|A001 |
|A002 |
|A003 |
|A003 |
|A001 |
+-------+
我在这里签入了这个SO解决方案,但在那里dataframe逗号分隔列是根据静态字符串值进行验证的,但我需要迭代一个包含许多不同值的行的dataframe。
谢谢你的帮助。
您可以首先拆分
和分解
列DF1.csv_column
,在DF2
上联接
之后,您可以groupby
和concat_ws
。例如,您可以执行以下操作:
import pyspark.sql.functions as F
df_res = (df2.join( df1.withColumn('color', F.explode(F.split('csv_column',',\s*'))),
on='color', how='left')
.groupby("CLRCODE").agg(F.concat_ws(", ", F.collect_list(F.col('id'))).alias('id'))
.orderBy('CLRCODE').drop('CLRCODE'))
df_res.show()
+----------------+
| id|
+----------------+
|A001, A002, A003|
| A001, A004|
| A001|
| A002, A004|
|A001, A002, A003|
| A003|
| A001|
+----------------+
编辑:对于编辑后的预期输出,需要split
、explode
和join
部分。然后orderby
和选择
所需的列:
import pyspark.sql.functions as F
df_res = (df2.join( df1.withColumn('color', F.explode(F.split('csv_column',',\s*'))),
on='color', how='left').orderBy(*['CLRCODE', 'id']).select('id'))
df_res.show()
+----+
| id|
+----+
|A001|
|A002|
|A003|
|A001|
|A004|
|A001|
|A002|
|A004|
|A001|
|A002|
|A003|
|A003|
|A001|
+----+
问题内容: 我有一张这样的桌子: 我想测试3和15是否在称为NUMBERS的Blob中。并可以看到无法使用LIKE %% 仅选择ID为2且具有三个scoulb的行… 问题答案: 这个也可以: 使用IN将查找以逗号分隔的字符串,例如。这两个 在此页面上找到的信息:
问题内容: 我的数据库中有一个表,如下所示: 我需要创建一个SELECT语句,该语句在’mgroup_others’逗号分隔列表中指定整数的位置选择所有成员。因此,例如,我编写了一条SQL语句,该语句将选择’mgroup_others’包含‘10’的所有成员,并且它将返回成员1、2和3但不返回成员4,因为10不在该字段中。任何帮助将不胜感激!谢谢。我也是用PHP编写的。 问题答案: 由于是列,如果
问题内容: 这是我的表结构: 我需要拆分该列,并希望通过一个简单的sql查询来做到这一点,因为我不知道如何使用函数,并且希望将其保持简单。 这是我已经发现的: 但这仅输出 有没有一种方法来拆分一切从到,,等? 提前致谢。 问题答案:
问题内容: 我想在MySQL中将选定的值转换为逗号分隔的字符串。我的初始代码如下: 哪个产生了: 我想要的输出看起来像这样: 问题答案: 检查一下
问题内容: 我想比较具有两个不同Oracle表的逗号分隔值的两列(差异表)的值。我想找到与所有值 都 匹配的行( 所有值都应与值匹配)。 注意:逗号分隔值的顺序不同。 例子: T1: T2: MY RESULT应该仅在两个表中显示基于“所有名称匹配”的匹配行。 尝试过但无法使其正常工作。 我使用下面的代码来解析值: 问题答案: 您可以将表格转换为第一范式,然后比较存储在每一行中的化合物。起点可以是
问题内容: 我的表格中有一个字段,其中包含逗号分隔的字符串,例如。每个数字代表可用的颜色。 运行查询以获取所有红色衬衫(颜色= 1)时,我还会获取颜色为灰色(= 12)和橙色(= 15)的衬衫。 我应该如何重写查询,以便仅选择颜色1而不是选择所有包含数字1的颜色? 问题答案: 经典方法是在左右添加逗号: 但是find_in_set也可以: