拆分特定的 PySpark df 列并创建另一个 DF
Splitting a specific PySpark df column and create another DF
我有一个 dataframe(比如说,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 的元素转换为带位置的多行和多列。
from pyspark.sql.functions import posexplode
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来抓取这个数组中索引pos处的元素。
第一个是我们新列的名称,它将是数字和数组中索引的串联。第二列将是数组中相应索引处的值。我们通过利用 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 分组并旋转 DataFrame
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()
给出最终数据框:
从中获取详细信息:
Split Spark Dataframe string column into multiple columns
我有一个 dataframe(比如说,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 的元素转换为带位置的多行和多列。
from pyspark.sql.functions import posexplode
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来抓取这个数组中索引pos处的元素。
第一个是我们新列的名称,它将是数字和数组中索引的串联。第二列将是数组中相应索引处的值。我们通过利用 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 分组并旋转 DataFrame
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()
给出最终数据框:
从中获取详细信息: Split Spark Dataframe string column into multiple columns