下面是我的家庭用品示例数据框架。
在这里,w代表木头,p代表玻璃,p代表塑料,不同的物品被分类在这个类别中。所以我想确定哪些项目属于w,g,p类。作为第一步,我试着把它分类成椅子
M = sqlContext.createDataFrame([('W-Chair-Shelf;G-Vase;P-Cup',''),
('W-Chair',''),
('W-Shelf;G-Cup;P-Chair',''),
('G-Cup;P-ShowerCap;W-Board','')],
['Household_chores_arrangements','Chair'])
M.createOrReplaceTempView('M')
+-----------------------------+-----+
|Household_chores_arrangements|Chair|
+-----------------------------+-----+
| W-Chair-Shelf;G-Vase;P-Cup| |
| W-Chair| |
| W-Shelf;G-Cup;P-Chair| |
| G-Cup;P-ShowerCap;W-Board| |
+-----------------------------+-----+
我试着做了一个条件,我可以标记为w,但我没有得到预期的结果,可能是我的条件是错误的。
df = sqlContext.sql("select * from M where Household_chores_arrangements like '%W%Chair%'")
display(df)
在Pypark有更好的方法吗
预期产量
+-----------------------------+-----+
|Household_chores_arrangements|Chair|
+-----------------------------+-----+
| W-Chair-Shelf;G-Vase;P-Cup| W|
| W-Chair| W|
| W-Shelf;G-Cup;P-Chair| P|
| G-Cup;P-ShowerCap;W-Board| NULL|
+-----------------------------+-----+
感谢@mck-的解决方案。
除此之外,我还试图对regexp\u extract option进行更多的分析,因此修改了样本集
M = sqlContext.createDataFrame([('Wooden|Chair',''),
('Wooden|Cup;Glass|Chair',''),
('Wooden|Cup;Glass|Showercap;Plastic|Chair','') ],
['Household_chores_arrangements','Chair'])
M.createOrReplaceTempView('M')
df = spark.sql("""
select
Household_chores_arrangements,
nullif(regexp_extract(Household_chores_arrangements, '(Wooden|Glass|Plastic)(|Chair)', 1), '') as Chair
from M
""")
display(df)
结果:
+-----------------------------+-----------------+
|Household_chores_arrangements| Chair|
+-----------------------------+-----------------+
| Wooden|Chair |Wooden|
| Wooden|Cup;Glass|Chair |Wooden|
|Wooden|Cup;Glass|Showercap;Plastic|Chair|Wooden|
+-----------------------------+----------------+
将分隔符改为|,而不是-并对查询进行了更改。预期结果如下,但得出错误结果
+-----------------------------+-----------------+
|Household_chores_arrangements| Chair|
+-----------------------------+-----------------+
| Wooden|Chair |Wooden|
| Wooden|Cup;Glass|Chair |Glass |
|Wooden|Cup;Glass|Showercap;Plastic|Chair|Plastic|
+-----------------------------+----------------+
如果只更改了分隔符,是否需要更改其他值?
更新-2
我已经得到了上述更新的解决方案。
对于管道分隔符,我们必须使用4来转义它们\
1条答案
按热度按时间lokaqttq1#
你可以用
regexp_extract
要提取类别,如果找不到匹配项,请使用将空字符串替换为nullnullif
.