String 如何使用pySpark识别列中是否存在特定的字符串/模式

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

下面是我的家庭用品示例数据框架

此处W代表木制 G代表玻璃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)
在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个转义符(木制、玻璃、塑料)(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。