【问题标题】:Tell pyspark about known ordering告诉 pyspark 已知的排序
【发布时间】:2020-09-17 08:31:27
【问题描述】:

我有一个包含 row_id 的庞大数据集,因此我知道 row_id 是单调递增的,并且数据分区是按此 row_id 排序的。

现在我想使用 lag() 函数移动一些列:

window = sql.Window.partitionBy().orderBy('row_id')
df = df.withColumn('shifted_my_value', F.lag(df.my_value).over(window))

但是,pyspark 并不知道数据已经按 row_id 排序,并且想要分析/重新洗牌整个数据集(尽管我知道这将是一个无用的)。

有没有办法告诉 spark 我的数据已经按 row_id 排序,它应该只移动 my_values 中的值而不尝试洗牌。

【问题讨论】:

    标签: pyspark data-partitioning


    【解决方案1】:

    一个选项可能只是不按窗口中的一行排序 -

    window = sql.Window.partitionBy().orderBy('select 1')
    df = df.withColumn('shifted_my_value', F.lag(df.my_value).over(window))
    

    我不确定在 pyspark 中它会像这样或那样工作 -

    window = sql.Window.partitionBy().orderBy('(select 1)')
    df = df.withColumn('shifted_my_value', F.lag(df.my_value).over(window))
    

    在 SQL 中它可以这样工作 -

    df.registerTempTable('df')
    spark.sql('select LAG(df.my_value) OVER (order by (select 1)) FROM df' )
    

    【讨论】:

    • 我担心最后一个命令我得到“AssertionError: col 应该是 Column”。前两个抱怨“select 1”不是列。
    • 对不起,我忘了在我的 sql 查询中添加 FROM df。它现在可能有效。
    • 是的,我就是这么想的,所以我添加了它,它给出了“AssertionError: col should be Column”。
    • 我也想知道partitionBy() 参数。如果我的数据集很大,我不能把所有数据放在同一个分区中,对吧?
    • 你确定select 1 真的保持原来的顺序吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 2011-10-14
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多