Python 如何在pyspark中动态拆分和分组数字

Python 如何在pyspark中动态拆分和分组数字,python,pyspark,apache-spark-sql,pyspark-dataframes,Python,Pyspark,Apache Spark Sql,Pyspark Dataframes,我在一个数据帧中有以下列,它的数字是6位数,是6的倍数,我试图实现的是将该列拆分为2个3位数的子组,因为有一个关系。 这是数据帧 +------------------------+---+ |Col1 |len| +------------------------+---+ |001200 |6 | |201400 |6 | |401800 |6 |

我在一个数据帧中有以下列,它的数字是6位数,是6的倍数,我试图实现的是将该列拆分为2个3位数的子组,因为有一个关系。 这是数据帧

+------------------------+---+
|Col1                    |len|
+------------------------+---+
|001200                  |6  |
|201400                  |6  |
|401800                  |6  |
|201400401800            |12 |
|001200201400401800      |18 |
|001200201400401800801999|24 |
+------------------------+---+
我期待的是这样

+------------------------+-------------------------------+---+
|Col1                    |processed_column               |len|
+------------------------+-------------------------------+---+
|001200                  |001-200                        |6  |
|201400                  |201-400                        |6  |
|401800                  |401-800                        |6  |
|201400401800            |201-400,401-800                |12 |
|001200201400401800      |001-200,201-400,401-800        |18 |
|001200201400401800801999|001-200,201-400,401-800,801-999|24 |
+------------------------+-------------------------------+---+

我能想到的一个解决方案是检查len并根据它进行拆分,但是我必须继续为每个长度编写F.when条件,并相应地拆分它

df = df.withColumn(
            "processed_column",
            F.when(
                F.col("len") == 6,
                F.concat(
                    F.substring(F.col("Col1"), 0, 3),
                    F.lit("-"),
                    F.substring(F.col("Col1"), 3, 3),
                ),
            )
            .when(
                F.col("len") == 12,
                F.concat(
                    F.substring(F.col("Col1"), 0, 3),
                    F.lit("-"),
                    F.substring(F.col("Col1"), 4, 3),
                    F.lit(","),
                    F.substring(F.col("Col1"), 7, 3),
                    F.lit("-"),
                    F.substring(F.col("Col1"), 10, 3),
                ),
            )
            .otherwise(F.col("Col1")),
        )

有没有更好的方法可以动态处理这个问题?

我不知道pyspark,但是在Python中,您可以这样做,将所有六个字符串的倍数更改为您所问的样式

def(s):
返回“,”。对范围(len(s)//6)中的i进行连接([s[i*6:i*6+3]+'-'+s[i*6+3:i*6+6]))
印刷品(f('401800'))
打印(f('201400401800'))
打印(f('001200201400401800'))
打印(f('001200201400401800801999'))
401-800
201-400401-800
001-200201-400401-800

001-200201-400401-800801-999

我不知道pyspark,但在Python中,可以这样做,将六个字符串的所有倍数更改为您所问的样式

def myFunction(s):
    return ','.join([s[i*6:i*6+3]+'-'+s[i*6+3:i*6+6] for i in range(len(s)//6)])
udf_myFunction = F.udf(myFunction)
df.withColumn('new_string', udf_myFunction("Col1")).show()
def(s):
返回“,”。对范围(len(s)//6)中的i进行连接([s[i*6:i*6+3]+'-'+s[i*6+3:i*6+6]))
印刷品(f('401800'))
打印(f('201400401800'))
打印(f('001200201400401800'))
打印(f('001200201400401800801999'))
401-800
201-400401-800
001-200201-400401-800

001-200201-400401-800801-999

谢谢@watfe,我能够使用它创建一个udf函数:)谢谢@watfe,我能够使用它创建一个udf函数:)使用regexp_replace,然后修剪一个额外的尾随逗号:
df.withColumn('processed_column',F.expr(r“rtrim(',',regexp_replace(Col1),(\\d{3})(\\d{3}),$1-$2'))))
让我来测试一下,然后给你反馈。@jxc它可以工作,如果你能解释regex语法使用regexp\u replace,然后修剪一个额外的尾随逗号,我将不胜感激:
df.withColumn('processed_column',F.expr(r“rtrim(',',regexp\u replace(Col1'(\\d{3})(\\d{3})',$1-$2'))
让我来测试一下,然后给你反馈。@jxc它可以工作,如果你能解释一下正则表达式语法,我将不胜感激
def myFunction(s):
    return ','.join([s[i*6:i*6+3]+'-'+s[i*6+3:i*6+6] for i in range(len(s)//6)])
udf_myFunction = F.udf(myFunction)
df.withColumn('new_string', udf_myFunction("Col1")).show()