Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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 火花读取分区avro明显慢于指向准确位置_Apache Spark_Pyspark_Avro_Azure Databricks - Fatal编程技术网

Apache spark 火花读取分区avro明显慢于指向准确位置

Apache spark 火花读取分区avro明显慢于指向准确位置,apache-spark,pyspark,avro,azure-databricks,Apache Spark,Pyspark,Avro,Azure Databricks,我正在尝试读取分区的Avro数据,该数据是基于年、月和日进行分区的,这似乎比将其直接指向路径要慢得多。 在物理计划中,我可以看到分区过滤器正在被传递,因此它不会扫描整个目录集,但仍然要慢很多 例如,像这样读取分区数据 profitLossPath="abfss://raw@"+datalakename+".dfs.core.windows.net/datawarehouse/CommercialDM.ProfitLoss/" profitLoss =

我正在尝试读取分区的Avro数据,该数据是基于年、月和日进行分区的,这似乎比将其直接指向路径要慢得多。 在物理计划中,我可以看到分区过滤器正在被传递,因此它不会扫描整个目录集,但仍然要慢很多

例如,像这样读取分区数据

profitLossPath="abfss://raw@"+datalakename+".dfs.core.windows.net/datawarehouse/CommercialDM.ProfitLoss/"
 
profitLoss = spark.read.\
    format("com.databricks.spark.avro").\
    option("header", "false").\
    option("inferSchema", "false").load(profitLossPath)
 
profitLoss.createOrReplaceTempView("ProfitLosstt")

df=sqlContext.sql("SELECT * \
                             FROM ProfitLosstt \
                             where Year= " + year + " and Month=" + month_nz + " and Day=" + date_nz )

大约需要3分钟

而在这里,我使用字符串生成器指向确切的位置,只需2秒钟即可完成

profitLossPath="abfss://raw@"+datalakename+".dfs.core.windows.net/datawarehouse/CommercialDM.ProfitLoss/Year=" +year +"/Month=" + month_nz + "/Day=" + date_nz
 
profitLoss = spark.read.\
    format("com.databricks.spark.avro").\
    option("header", "false").\
    option("inferSchema", "false").load(profitLossPath)

 
profitLoss.createOrReplaceTempView("ProfitLosstt")

df=sqlContext.sql("SELECT * \
                             FROM ProfitLosstt "
                              )
                  
display(df)
查看第一个(较慢)的物理计划确实表明分区过滤器已传递

什么能解释发现阶段花了这么长时间


任何问题,我都可以详细说明。

好的,速度慢的原因是因为建立了InMemoryFileIndex

虽然进行了分区修剪,但是Spark需要知道分区和文件信息,这就是它需要执行的步骤。 这篇S.O帖子详细阐述了这一点:

因此,当时的想法是创建一个外部表,以便构建此信息,我使用了这样的脚本(我使用了一个内联模式,如果有模式文件,可以使用模式文件)

但如果您随后查询此表,将得到0行。这是因为现有分区不是自动添加的。所以,你可以使用

msck repair table ProfitLossAvro
每次向datalake添加数据时,都可以进行添加分区。 大概是这样的:-

ALTER TABLE ProfitLossAvro ADD PARTITION (Year=2020, Month=6, Day=26)
如果使用下面的命令查询数据,它的运行速度会快得多

df=sqlContext.sql("select * \
               from ProfitLossAvro \
               where Year=" + year + " and Month=" + month_nz + " and Day=" + date_nz)

display(df)

你能对第一个进行
df.解释并把输出放在这里吗?我怀疑没有谓词pushdownHi,正如我提到的,分区过滤器正在传递:这是Spark UI的物理计划:==物理计划==分区过滤器:[isnotnull(年份448),isnotnull(月份449),isnotnull(日期450),(年份448=2020),(月份449=6…,PushedFilters:[],ReadSchema:struct这段时间花在准备作业上。很长一段时间,它只说“运行命令”没有任何作业。当作业开始时,它完成得很快。因此,不知何故,创建执行计划需要很长时间?从驱动程序日志中,我看到建立InMemoryFileIndex需要很多时间。大约2.18分钟。现在来看:是的,这就是原因所在-要推送过滤器,它需要知道它们可以应用到哪里。。。
df=sqlContext.sql("select * \
               from ProfitLossAvro \
               where Year=" + year + " and Month=" + month_nz + " and Day=" + date_nz)

display(df)