用文字值创建一个数组,然后使用 PySpark 分解

问题描述 投票:0回答:2

假设我有一个如下所示的数据框:

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 数组,它也确实有效。我怎样才能分解数据框?

arrays dataframe apache-spark pyspark literals
2个回答
0
投票

按照维尔纳的建议工作

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()

0
投票

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|
# +------+------+---+-------+
© www.soinside.com 2019 - 2024. All rights reserved.