Dataframe 为什么pySpark在使用apachearrow处理字符串类型时会崩溃?

Dataframe 为什么pySpark在使用apachearrow处理字符串类型时会崩溃?,dataframe,pyspark,pyarrow,apache-arrow,Dataframe,Pyspark,Pyarrow,Apache Arrow,为了在大型数据集上获得一些离群点图,我需要将spark数据帧转换为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

为了在大型数据集上获得一些离群点图,我需要将spark数据帧转换为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.setspark.sql.execution.arrow.maxRecordsPerBatch、5000等选项似乎无效,因为web ui显示分配给任务的记录明显超过5000条


任何关于如何解决pyspark控制台崩溃或更直接地呈现大型散点图的指示都将不胜感激-我已尝试找到一种应用表的方法,但未成功。to_pandassplit_blocks=True,self_destruct=true,但未从spark数据帧中获取可启用的结构。

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

找到异常值的一种方法是计算x列的异常值,然后在创建数据帧之前将_df过滤到Spark中的相关容器:

hist=a_df.selectx.rdd.flatmap lambda x:x.histogram10创建10个存储箱 hist是由两个数组组成的元组:第一个数组包含容器的边界,第二个数组包含每个容器中的元素数:

[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]
创建均匀分布的randon数,因此本例中的直方图不是很有趣。但对于现实世界的发行版,柱状图将非常有用。

此片段可能与此相关,请注意,即使使用Arrow,DataFrame.toPandas也会将DataFrame中的所有记录收集到驱动程序,并且应该在数据的一小部分上完成。您应该能够使用较小的内存使用量。这就是maxRecordsPerBatch属性的用途。@谢谢。我不知道这个限制只适用于熊猫自选基金。这就解释了观察到的行为。谢谢。我试图以某种方式避免在驱动程序上收集数据,同时保持pandas的高级功能—33.4m仅占完整数据的1%。也许在未来的某个时候,可能会有一种结构,其行为类似于用户的熊猫数据框架,并利用spark的规模。同时,我将满足于spark: