Apache spark 如何将pyspark dataframe列拆分为两列(下面的示例)?

Apache spark 如何将pyspark dataframe列拆分为两列(下面的示例)?,apache-spark,pyspark,split,apache-spark-sql,Apache Spark,Pyspark,Split,Apache Spark Sql,该列在一行中多次使用分隔符,因此拆分不是那么简单。 拆分时,在这种情况下只需考虑第一个分隔符出现 到目前为止,我正在这样做 但是,我觉得有更好的解决办法吗 我只使用字符串函数,看不出使用正则表达式的理由 from pyspark.sql import functions as F testdf\ .withColumn("Food1", F.expr("""substring(Food,1,instr(Food,',')-1)"""))\ .withColumn("Fo

该列在一行中多次使用分隔符,因此拆分不是那么简单。 拆分时,在这种情况下只需考虑第一个分隔符出现

到目前为止,我正在这样做

但是,我觉得有更好的解决办法吗

我只使用字符串函数,看不出使用正则表达式的理由

from pyspark.sql import functions as F

testdf\
      .withColumn("Food1", F.expr("""substring(Food,1,instr(Food,',')-1)"""))\
      .withColumn("Food2", F.expr("""substring(Food,instr(Food,',')+1,length(Food))""")).show()

#+------+---------------+-----+----------+
#|Animal|           Food|Food1|     Food2|
#+------+---------------+-----+----------+
#|   Dog|meat,bread,milk| meat|bread,milk|
#|   Cat|     mouse,fish|mouse|      fish|
#+------+---------------+-----+----------+*
我只使用字符串函数,看不出使用正则表达式的理由

from pyspark.sql import functions as F

testdf\
      .withColumn("Food1", F.expr("""substring(Food,1,instr(Food,',')-1)"""))\
      .withColumn("Food2", F.expr("""substring(Food,instr(Food,',')+1,length(Food))""")).show()

#+------+---------------+-----+----------+
#|Animal|           Food|Food1|     Food2|
#+------+---------------+-----+----------+
#|   Dog|meat,bread,milk| meat|bread,milk|
#|   Cat|     mouse,fish|mouse|      fish|
#+------+---------------+-----+----------+*

稍微不同的方法是使用和:

从pyspark.sql.functions导入expr,拆分 df.With Column Food_u ar,splitfood\ .选择\ df.动物, df.食物, exprfood_ar[0]。别名为food1, exprtrim'[]',stringslicefood_ar,2,sizefood_ar-1.aliasFood2 +---+--------+---+-----+ |动物|食物|食物1 |食物2| +---+--------+---+-----+ |狗|肉,面包,牛奶|肉|面包,牛奶| |猫、老鼠、鱼、老鼠、鱼| +---+--------+---+-----+
首先使用split First,就像您已经生成数组一样。接下来,我们使用single Spark SQL访问器a[0]访问项目,以填充阵列的头部和切片以及尾部的修剪。

稍微不同的方法是使用和:

从pyspark.sql.functions导入expr,拆分 df.With Column Food_u ar,splitfood\ .选择\ df.动物, df.食物, exprfood_ar[0]。别名为food1, exprtrim'[]',stringslicefood_ar,2,sizefood_ar-1.aliasFood2 +---+--------+---+-----+ |动物|食物|食物1 |食物2| +---+--------+---+-----+ |狗|肉,面包,牛奶|肉|面包,牛奶| |猫、老鼠、鱼、老鼠、鱼| +---+--------+---+-----+
首先使用split First,就像您已经生成数组一样。接下来,我们使用single Spark SQL访问器a[0]访问项目,以填充数组的头部和切片以及尾部的修剪。

一种使用正则表达式仅从列表中分割第一个匹配项的方法

testdf.withColumn('Food1',f.split('Food',"(?<=^[^,]*)\\,")[0]).\
       withColumn('Food2',f.split('Food',"(?<=^[^,]*)\\,")[1]).show()

+------+---------------+-----+----------+
|Animal|           Food|Food1|     Food2|
+------+---------------+-----+----------+
|   Dog|meat,bread,milk| meat|bread,milk|
|   Cat|     mouse,fish|mouse|      fish|
+------+---------------+-----+----------+

一种使用正则表达式仅从列表中拆分第一个匹配项的方法

testdf.withColumn('Food1',f.split('Food',"(?<=^[^,]*)\\,")[0]).\
       withColumn('Food2',f.split('Food',"(?<=^[^,]*)\\,")[1]).show()

+------+---------------+-----+----------+
|Animal|           Food|Food1|     Food2|
+------+---------------+-----+----------+
|   Dog|meat,bread,milk| meat|bread,milk|
|   Cat|     mouse,fish|mouse|      fish|
+------+---------------+-----+----------+

我现在已经接受了这个答案,因为它处理的是一个连一个逗号都没有的情况。在我们的例子中,Cow,grass会被分成Cow,grass,grass,null。@Shubham-你介意为正则表达式提供一个解释吗?如果有人有不同的定界符,我现在实际上已经接受了这个答案,因为它在没有1个逗号的情况下处理角落的情况。在我们的例子中,Cow,grass会被分成Cow,grass,grass,null。@Shubham-你介意为正则表达式提供一个解释吗?如果有人有不同的定界符,这就很好了。但是,如果字符串中不存在分隔符,是否可以返回null?这非常好。但是,如果字符串中不存在分隔符,是否可以返回null?