假设我有一个如下所示的数据框:
df = spark.createDataFrame([(100, 'AB', 304), (200, 'BC', 305), (300, 'CD', 306)], ['number', 'letter', 'id'])
我想用
["source1", "source2", "source3"]
创建一个数组列,我稍后想要explode
。
这没有用:
df_arr = df.withColumn("source", array(lit("source1"), lit("source2"), lit("source3")))
我创建了一个用于爆炸的 numpy 数组,它也确实有效。我怎样才能分解数据框?
按照维尔纳的建议工作
from pyspark.sql import functions as f
from pyspark.sql.functions import lit
df2=df.withColumn("source", F.array(lit("source1"),lit("source2"),lit("source3")))
df2.withColumn("source", F.explode("source")).show()
从Spark 3.4+你可以使用列表inside
lit
:
from pyspark.sql import functions as F
df = spark.createDataFrame(
[(100, 'AB', 304), (200, 'BC', 305), (300, 'CD', 306)],
['number', 'letter', 'id']
)
df = df.withColumn('source', F.explode(F.lit(['source1', 'source2', 'source3'])))
df.show()
# +------+------+---+-------+
# |number|letter| id| source|
# +------+------+---+-------+
# | 100| AB|304|source1|
# | 100| AB|304|source2|
# | 100| AB|304|source3|
# | 200| BC|305|source1|
# | 200| BC|305|source2|
# | 200| BC|305|source3|
# | 300| CD|306|source1|
# | 300| CD|306|source2|
# | 300| CD|306|source3|
# +------+------+---+-------+
另一种方法——在创建数据框时使用 Python 列表,之后使用
explode
:
from pyspark.sql import functions as F
sources = ['source1', 'source2', 'source3']
df = spark.createDataFrame(
[(100, 'AB', 304, sources),
(200, 'BC', 305, sources),
(300, 'CD', 306, sources)],
['number', 'letter', 'id', 'source'])
df = df.withColumn('source', F.explode('source'))
df.show()
# +------+------+---+-------+
# |number|letter| id| source|
# +------+------+---+-------+
# | 100| AB|304|source1|
# | 100| AB|304|source2|
# | 100| AB|304|source3|
# | 200| BC|305|source1|
# | 200| BC|305|source2|
# | 200| BC|305|source3|
# | 300| CD|306|source1|
# | 300| CD|306|source2|
# | 300| CD|306|source3|
# +------+------+---+-------+