Python 如何在pyspark中动态拆分和分组数字
我在一个数据帧中有以下列,它的数字是6位数,是6的倍数,我试图实现的是将该列拆分为2个3位数的子组,因为有一个关系。 这是数据帧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 |
+------------------------+---+
|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-800201-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-800201-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()