微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 pySpark 在将 Apache Arrow 用于字符串类型时会崩溃?

如何解决为什么 pySpark 在将 Apache Arrow 用于字符串类型时会崩溃?

为了在大型数据集上获得一些异常值图,我需要将 spark DataFrame 转换为 pandas。对于 Apache Arrow,在将 x 转换为字符串时,一个简单的运行会导致我的 pyspark 控制台崩溃(在没有转换的情况下它也能正常工作),为什么?

Using Python version 3.8.9 (default,Apr 10 2021 15:47:22)
Spark context Web UI available at http://6d0b1018a45a:4040
Spark context available as 'sc' (master = local[*],app id = local-1621164597906).
SparkSession available as 'spark'.
>>> import time
>>> from pyspark.sql.functions import rand
>>> from pyspark.sql import functions as F
>>> spark = SparkSession.builder.appName("Console_Test").getorCreate()
>>> spark.conf.set("spark.sql.execution.arrow.enabled","true")
21/05/16 11:31:03 WARN sqlConf: The sql config 'spark.sql.execution.arrow.enabled' has been deprecated in Spark v3.0 and may be removed in the future. Use 'spark.sql.execution.arrow.pyspark.enabled' instead of it.
>>> a_df = spark.range(1 << 25).toDF("id").withColumn("x",rand())
>>> a_df = a_df.withColumn("id",F.col("id").cast("string"))
>>> start_t = time.time()
>>> a_pd = a_df.toPandas()
Killed                                                                          
#

此外,我注意到 spark.conf.set("spark.sql.execution.arrow.maxRecordsPerBatch","5000") 等选项似乎无效,因为网络用户界面显示分配给任务的记录明显超过 5000。

任何有关如何解决 pyspark 控制台崩溃或更直接渲染大型散点图的指示都将受到高度赞赏 - 我(未成功)尝试找到应用 Table.to_pandas(split_blocks=True,self_destruct=True)方法,但没有从火花DataFrame

解决方法

您尝试将 33.5 mio (2^25) 行转换为 Pandas 数据帧。这将导致 OutOfMemoryError,因为所有数据都将传输到 Spark 驱动程序。

找出异常值的一种方法是计算列 xhistogram,然后在创建 Pandas 数据框之前将 a_df 过滤到 Spark 中的相关 bin:

hist = a_df.select("x").rdd.flatMap(lambda x: x).histogram(10) #create 10 bins

hist 是两个数组的元组:第一个数组包含 bin 的边界,第二个数组包含每个 bin 中元素的数量:

([1.7855041778425118e-08,0.1000000152099446,0.20000001256484742,0.30000000991975023,0.40000000727465307,0.5000000046295558,0.6000000019844587,0.6999999993393615,0.7999999966942644,0.8999999940491672,0.99999999140407],[3355812,3356891,3352364,3352438,3357564,3356213,3354933,3355144,3357241,3355832])

rand 创建均匀分布的随机数,因此这种情况下的直方图不是很有趣。但对于现实世界的分布,直方图会很有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?