2017-08-25 115 views
0

我在Apache上运行星火一些SQL查询时面临很长的等待时间。为了简化该查询,我跑我的计算以顺序的方式:每个查询的输出被存储为临时表(.registerTempTable(“TEMP”)),所以它可以在下面的SQL查询中使用等等。 ..但是查询花费了太多时间,而在“纯Python”代码中,只需要几分钟。优化Apache的星火SQL查询

sqlContext.sql(""" 
 
SELECT PFMT.* , 
 
DICO_SITES.CodeAPI 
 
FROM PFMT 
 
INNER JOIN DICO_SITES 
 
ON PFMT.assembly_department = DICO_SITES.CodeProg """).registerTempTable("PFMT_API_CODE") 
 

 
sqlContext.sql(""" 
 
SELECT GAMMA.*, 
 
(GAMMA.VOLUME*GAMMA.PRORATA)/100 AS VOLUME_PER_SUPPLIER 
 
FROM 
 
(SELECT PFMT_API_CODE.* , 
 
SUPPLIERS_PROP.CODE_SITE_FOURNISSEUR, 
 
SUPPLIERS_PROP.PRORATA 
 
FROM PFMT_API_CODE 
 
INNER JOIN SUPPLIERS_PROP ON PFMT_API_CODE.reference = SUPPLIERS_PROP.PIE_NUMERO 
 
AND PFMT_API_CODE.project_code = SUPPLIERS_PROP.FAM_CODE 
 
AND PFMT_API_CODE.CodeAPI = SUPPLIERS_PROP.SITE_UTILISATION_FINAL) GAMMA """).registerTempTable("TEMP_ONE") 
 

 
sqlContext.sql(""" 
 
SELECT TEMP_ONE.* , 
 
ADCP_DATA.* , 
 
CASE 
 
WHEN ADCP_DATA.WEEK <= weekofyear(from_unixtime(unix_timestamp())) + 24 THEN ADCP_DATA.CAPACITY_ST + ADCP_DATA.ADD_CAPACITY_ST 
 
WHEN ADCP_DATA.WEEK > weekofyear(from_unixtime(unix_timestamp())) + 24 THEN ADCP_DATA.CAPACITY_LT + ADCP_DATA.ADD_CAPACITY_LT 
 
END AS CAPACITY_REF 
 
FROM TEMP_ONE 
 
INNER JOIN ADCP_DATA 
 
ON TEMP_ONE.reference = ADCP_DATA.PART_NUMBER 
 
AND TEMP_ONE.CodeAPI = ADCP_DATA.API_CODE 
 
AND TEMP_ONE.project_code = ADCP_DATA.PROJECT_CODE 
 
AND TEMP_ONE.CODE_SITE_FOURNISSEUR = ADCP_DATA.SUPPLIER_SITE_CODE 
 
AND TEMP_ONE.WEEK_NUM = ADCP_DATA.WEEK_NUM 
 
""").registerTempTable('TEMP_BIS') 
 

 
sqlContext.sql(""" 
 
SELECT TEMP_BIS.CSF_ID, 
 
TEMP_BIS.CF_ID , 
 
TEMP_BIS.CAPACITY_REF, 
 
TEMP_BIS.VOLUME_PER_SUPPLIER, 
 
CASE 
 
WHEN TEMP_BIS.CAPACITY_REF >= VOLUME_PER_SUPPLIER THEN 'CAPACITY_OK' 
 
WHEN TEMP_BIS.CAPACITY_REF < VOLUME_PER_SUPPLIER THEN 'CAPACITY_NOK' 
 
END AS CAPACITY_CHECK 
 
FROM TEMP_BIS 
 
""").take(100)

谁能亮点(如果有的话),用于星火编写pyspark SQL查询的最佳做法是什么? 在我的计算机上本地脚本比在Hadoop集群上快得多吗? 在此先感谢

+0

中继而是纯粹的SQL语法,您可以使用数据框火花和火花缓存能力 – dumitru

回答

0

你应该缓存你的中间结果,什么是数据源? 您可以只从中检索相关数据或仅检索相关列。有很多选项可以提供有关数据的更多信息。

+0

有两个数据源:一些来自文本文件,其他从蜂巢表。我只提取相关的列。此外,我广播相对较小的数据集以防止任何不必要的混洗。即使有了这些优化,我仍无法在可接受的时间内运行查询(因为数据量相对较小)。 – Galileo

+0

如果您使用zeppelin,则可以缓存数据,并且每次运行查询时,第一次后都会很快。 GB中有多少数据? – Dima

+0

存储在txt文件中的数据大约是4 Gb。 hive表中的数据大致相同。 – Galileo