Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark pyspark df.count()需要很长时间(或者根本不工作)_Apache Spark_Count_Pyspark - Fatal编程技术网

Apache spark pyspark df.count()需要很长时间(或者根本不工作)

Apache spark pyspark df.count()需要很长时间(或者根本不工作),apache-spark,count,pyspark,Apache Spark,Count,Pyspark,我有下面的代码,只是做一些连接,然后输出数据 from pyspark.sql.functions import udf, struct from pyspark import SparkContext from pyspark.sql import SparkSession from pyspark import SparkConf from pyspark.sql.functions import broadcast conf = SparkConf() conf.set('spark.l

我有下面的代码,只是做一些连接,然后输出数据

from pyspark.sql.functions import udf, struct
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark import SparkConf
from pyspark.sql.functions import broadcast

conf = SparkConf()
conf.set('spark.logConf', 'true')

spark = SparkSession \
    .builder \
    .config(conf=conf) \
    .appName("Generate Parameters") \
    .getOrCreate()

spark.sparkContext.setLogLevel("OFF")

df1 = spark.read.parquet("/location/mydata")
df1 = df1.select([c for c in df1.columns if c in ['sender','receiver','ccc,'cc','pr']])

df2 = spark.read.csv("/location/mydata2")

cond1 = [(df1.sender == df2._c1) | (df1.receiver == df2._c1)]

df3 = df1.join(broadcast(df2), cond1)
df3 = df3.select([c for c in df3.columns if c in['sender','receiver','ccc','cc','pr']])
df1
1862412799
行,而
df2
8679

当我打电话时

df3.count()
它似乎只是坐在那里与以下内容

[Stage 33:>                                                     (0 + 200) / 200]

此答案的假设:

  • df1是包含1862412799行的数据帧
  • df2是包含8679行的数据帧
  • df1.count()快速返回值(根据您的注释)
经济放缓可能发生在三个领域:

数据大小的不平衡(1862412799对8679):

虽然spark在处理大量数据方面非常出色,但它不能很好地处理非常小的数据集。如果没有特别设置,Spark会尝试将数据划分为多个部分,在小文件上,与每个部分的实际数据量相比,这可能过高。我建议尝试使用下面的方法,看看它是否能提高速度

df2 = spark.read.csv("/location/mydata2")
df2 = df2.repartition(2)
注意:这里的数字2只是一个估计的数字,基于多少分区适合该集中的行数

广播成本:

计数延迟可能是由于实际的广播步骤造成的。在加入之前,您的数据将被保存并复制到集群中的每个节点,一旦调用count(),所有这些都将同时发生。根据您的基础设施,这可能需要一些时间。如果上述重新分区不起作用,请尝试删除广播呼叫。如果这就是延迟,那么最好确认集群中没有瓶颈,或者如果有必要的话

意外的合并爆炸


我并不暗示这是一个问题,但是检查您设置的合并条件是否没有创建意外的重复项总是好的。这种情况很可能正在发生,并造成您在处理df3时遇到的速度减慢。

问题是,只需一秒钟就可以计算
1862412799
行,df3应该更小。还有一种连接操作也很有意义
df3=df1.join(broadcast(df2),cond1)
。该阶段已完成。这只是一个永远需要完成的计数。事实上,count()是一个懒惰的操作。您正在运行单节点群集吗?确定。在这种情况下,我如何查看df3中的记录数?我在一个边缘上运行这个nodeThanks!我发生了意外的合并爆炸。