Python 3.x 拆分特定PySpark df列并创建另一个df

Python 3.x 拆分特定PySpark df列并创建另一个df,python-3.x,pyspark,apache-spark-2.0,Python 3.x,Pyspark,Apache Spark 2.0,我有一个数据帧(比如,ac_df),它有32个不同的列。我想得到一个特定的列,并将值拆分为一个3的块,作为一个新值,然后从中创建另一个df ac_df['payment_history_1']给出以下结果 我想要一个结构如下的新df 例如:如果我取第一行“000000000000”,它被分组为 “000”、“000”、“000”、“000” 这将创建新df的第一行 执行此任务的Python等效代码如下所示: temp1 = ac_df['payment_history_1'].str.spl

我有一个数据帧(比如,ac_df),它有32个不同的列。我想得到一个特定的列,并将值拆分为一个3的块,作为一个新值,然后从中创建另一个df

ac_df['payment_history_1']
给出以下结果

我想要一个结构如下的新df

例如:如果我取第一行“000000000000”,它被分组为

“000”、“000”、“000”、“000”

这将创建新df的第一行

执行此任务的Python等效代码如下所示:

temp1 = ac_df['payment_history_1'].str.split(r'(...)', expand=True)
在spark中,我尝试了以下内容:

temp1 = ac_df.select(ac_df['payment_history_1']).rdd.map(lambda each_row: str(each_row[0])).map(lambda y: y.split(r'(...)')).collect()
输出:

 [['000000000000'], ['000000000003000000000'], ['000000000003000000000000000']]

然而,我无法前进并获得预期的结果。有人能提出建议吗?

试试这个,你将能够在此基础上构建:

df = spark.createDataFrame(
        [
            [1, '000000000000'], 
            [2, '000000000003000000000'], 
            [3, '000000000003000000000000000']
        ]
        , ["id", "numbers"]
        )


df.show()
应产生类似于您开始使用的数据帧的内容:

+---+--------------------+
| id|             numbers|
+---+--------------------+
|  1|        000000000000|
|  2|00000000000300000...|
|  3|00000000000300000...|
+---+--------------------+
使用数字列,您将能够将其解析为“,”分隔字符串,从中我们可以应用:posexplode(expr)-将数组expr的元素分隔为具有位置的多行,或将map expr的元素分隔为具有位置的多行和多列

df.select(
    "id",
    f.split("numbers", ",").alias("numbers"),
    f.posexplode(f.split("numbers", ",")).alias("pos", "val")
).show()
这将导致:

+---+--------------------+---+---+
| id|             numbers|pos|val|
+---+--------------------+---+---+
|  1|[000, 000, 000, 000]|  0|000|
|  1|[000, 000, 000, 000]|  1|000|
|  1|[000, 000, 000, 000]|  2|000|
|  1|[000, 000, 000, 000]|  3|000|
|  2|[000, 000, 000, 0...|  0|000|
|  2|[000, 000, 000, 0...|  1|000|
|  2|[000, 000, 000, 0...|  2|000|
|  2|[000, 000, 000, 0...|  3|003|
|  2|[000, 000, 000, 0...|  4|000|
|  2|[000, 000, 000, 0...|  5|000|
|  2|[000, 000, 000, 0...|  6|000|
|  3|[000, 000, 000, 0...|  0|000|
|  3|[000, 000, 000, 0...|  1|000|
|  3|[000, 000, 000, 0...|  2|000|
|  3|[000, 000, 000, 0...|  3|003|
|  3|[000, 000, 000, 0...|  4|000|
|  3|[000, 000, 000, 0...|  5|000|
|  3|[000, 000, 000, 0...|  6|000|
|  3|[000, 000, 000, 0...|  7|000|
|  3|[000, 000, 000, 0...|  8|000|
+---+--------------------+---+---+
接下来,我们使用:pyspark.sql.functions.expr获取该数组中索引位置处的元素

第一个是新列的名称,它是数组中数字和索引的串联。第二列是数组中相应索引处的值。我们通过利用pyspark.sql.functions.expr的功能获得后者,该功能允许我们使用列值作为参数

df.select(
    "id",
    f.split("numbers", ",").alias("numbers"),
    f.posexplode(f.split("numbers", ",")).alias("pos", "val")
)\
.drop("val")\
.select(
    "id",
    f.concat(f.lit("numbers"),f.col("pos").cast("string")).alias("number"),
    f.expr("numbers[pos]").alias("val")
)\
.show()
其结果是:

+---+--------+---+
| id|  number|val|
+---+--------+---+
|  1|numbers0|000|
|  1|numbers1|000|
|  1|numbers2|000|
|  1|numbers3|000|
|  2|numbers0|000|
|  2|numbers1|000|
|  2|numbers2|000|
|  2|numbers3|003|
|  2|numbers4|000|
|  2|numbers5|000|
|  2|numbers6|000|
|  3|numbers0|000|
|  3|numbers1|000|
|  3|numbers2|000|
|  3|numbers3|003|
|  3|numbers4|000|
|  3|numbers5|000|
|  3|numbers6|000|
|  3|numbers7|000|
|  3|numbers8|000|
+---+--------+---+
最后,我们可以根据id进行分组并透视数据帧

df.select(
    "id",
    f.split("numbers", ",").alias("numbers"),
    f.posexplode(f.split("numbers", ",")).alias("pos", "val")
)\
.drop("val")\
.select(
    "id",
    f.concat(f.lit("numbers"),f.col("pos").cast("string")).alias("number"),
    f.expr("numbers[pos]").alias("val")
)\
.groupBy("id").pivot("number").agg(f.first("val"))\
.show()
给出最终数据帧:

从以下方面获取详细信息:

您可以在dataframe列上使用类似于python中使用
str.split
的方法。