String 如何使用pySpark识别列中是否存在特定的字符串/模式
下面是我的家庭用品示例数据框架 此处W代表木制 G代表玻璃,P代表塑料,不同的项目被归类在该类别中。 所以我想确定哪些项目属于W,G,P类别。作为第一步,我尝试将其分类为椅子String 如何使用pySpark识别列中是否存在特定的字符串/模式,string,apache-spark,pyspark,apache-spark-sql,sql-like,String,Apache Spark,Pyspark,Apache Spark Sql,Sql Like,下面是我的家庭用品示例数据框架 此处W代表木制 G代表玻璃,P代表塑料,不同的项目被归类在该类别中。 所以我想确定哪些项目属于W,G,P类别。作为第一步,我尝试将其分类为椅子 M = sqlContext.createDataFrame([('W-Chair-Shelf;G-Vase;P-Cup',''), ('W-Chair',''), ('W-Shelf;G-Cup
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)
在pySpark中有更好的方法吗
预期产量
+-----------------------------+-----+
|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_提取选项的内容
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\对其进行转义。您可以使用
regexp\u extract
提取类别,如果未找到匹配项,则使用nullif
将空字符串替换为null
df = spark.sql("""
select
Household_chores_arrangements,
nullif(regexp_extract(Household_chores_arrangements, '([A-Z])-Chair', 1), '') as Chair
from M
""")
df.show(truncate=False)
+-----------------------------+-----+
|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 |
+-----------------------------+-----+
好啊但是,如果在家庭琐事安排中它是木制的而不是W,我们需要将它们更改为近似索引吗?那么您需要将正则表达式模式更改为,例如,
”(木制的玻璃塑料)-椅子“
,因此在regexp_摘录-1中,表示除需要拾取的组值/数字外,不需要注意。和-chair是我们要匹配的-表示示例数据中的分隔符。希望我是对的..这个例子也很好,在研究多个regexp_提取时,我尝试在示例数据和查询中用-替换为|,但是它没有给我预期的结果。让我看看我是否可以在同一个问题中发布更新。我得到了“分隔符”的解决方案,我们必须使用4个转义符(木制、玻璃、塑料)(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。