通过应用函数/lambda 来订购 PySpark Dataframe

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

我有一个 PySpark DataFrame,需要在列上排序(“参考”)。 该列中的值通常如下所示:

["AA.1234.56", "AA.1101.88", "AA.904.33", "AA.8888.88"]

我已经有一个函数可以对这个列表进行排序:

myFunc = lambda x: [int(a) if a.isdigit() else a for a in x.split(".")]

其产量符合要求:

["AA.904.33", "AA.1101.88", "AA.1234.56", "AA.8888.88"]

我想订购应用此的 DataFrame

lambda
。我尝试使用
sortByKey
但不清楚如何隔离特定列的 DataFrame。有什么想法吗?

与此相关的一般问题,但哪种用例需要将 PySpark DataFrame 转换为 RDD?

sortByKey
函数似乎只适用于RDD,而不适用于DataFrame。

python dataframe apache-spark pyspark rdd
1个回答
0
投票

Python udfs 会大大减慢你的解决方案。使用原生 Spark 的 sql 函数要好得多。在这种情况下,您的解决方案可能如下所示:

from pyspark.sql import functions as F

df = session.createDataFrame([("AA.1234.56",), ("AA.904.33",), ("AA.1101.88",)], ['data'])
df.show()

# +----------+
# |      data|
# +----------+
# |AA.1234.56|
# | AA.904.33|
# |AA.1101.88|
# +----------+

df = df.withColumn('spl', F.split(F.col('data'), '\.{1}'))
df = df.withColumn('1', F.col('spl').getItem(0)). \
    withColumn('2', F.col('spl').getItem(1).cast('int')). \
    withColumn('3', F.col('spl').getItem(2)).\
    orderBy('1', '2', '3')
df = df.select('data')
df.show()

# +----------+
# |      data|
# +----------+
# | AA.904.33|
# |AA.1101.88|
# |AA.1234.56|
# +----------+
© www.soinside.com 2019 - 2024. All rights reserved.