gpt4 book ai didi

apache-spark - Apache Spark 页面结果或查看大型数据集上的结果

转载 作者:行者123 更新时间:2023-12-05 07:34:44 25 4
gpt4 key购买 nike

我正在将 Hive 与 Spark 1.6.3 一起使用

我有一个大数据集(40000 行,20 列左右,每列可能包含 500 字节 - 3KB 数据)

查询是对 3 个数据集的连接

我希望能够对最终的连接数据集进行分页,我发现我可以使用 row_number() OVER (ORDER BY 1) 为数据集中的每一行生成一个唯一的行号数据集。

在这之后我可以做

SELECT * FROM dataset WHERE row between 1 AND 100

但是,有些资源建议不要使用 ORDER BY,因为它将所有数据放入 1 个分区(我可以在随机分配将数据移动到的日志中看到这种情况一个分区),当发生这种情况时,我会遇到内存不足的异常。

我将如何以更有效的方式对数据集进行分页?

我已经启用了 persist - MEMORY_AND_DISK 这样如果一个分区太大它就会溢出到磁盘(对于一些转换我可以看到至少有一些数据溢出到磁盘当我不使用 row_number() 时)

最佳答案

一种策略可以是先只选择数据集的 unique_key,然后只在该数据集上应用 row_number 函数。由于您是从大型数据集中选择单个列,因此它适合单个分区的可能性更高。

val dfKey = df.select("uniqueKey")
dfKey.createOrUpdateTempTable("dfKey")
val dfWithRowNum = spark.sql(select dfKey*, row_number() as row_number OVER (ORDER BY 1))
// save dfWithRowNum

完成对uniqueKey的row_number操作后;保存该数据框。现在在下一阶段将此数据框与更大的数据框连接起来,并将 row_number 列附加到该数据框。

dfOriginal.createOrUpdateTempTable("dfOriginal")
dfWithRowNum.createOrUpdateTempTable("dfWithRowNum")
val joined = spark.sql("select dfOriginal.* from dfOriginal join dfWithRowNum on dfOriginal.uniqueKey = dfWithRowNum.uniqueKey")
// save joined

现在可以查询了

SELECT * FROM joineddataset WHERE row between 1 AND 100

对于MEMORY_DISK的持久化,我发现偶尔会因为内存不足而失败。尽管可以保证执行,但我宁愿使用 DISK_ONLY 来降低性能。

关于apache-spark - Apache Spark 页面结果或查看大型数据集上的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50001496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com