2017-08-25 201 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