我有一个 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 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|
# +----------+