मैं डेटाब्रिक्स पर स्पार्क एसक्यूएल का उपयोग कर रहा हूं, जो एक हाइव मेटास्टोर का उपयोग करता है, और मैं एक नौकरी/क्वेरी स्थापित करने की कोशिश कर रहा हूं जो कुछ कॉलम (20+) का उपयोग करता है।

मेटास्टोर सत्यापन जांच चलाने में जितना समय लगता है, वह मेरी क्वेरी में शामिल स्तंभों की संख्या के साथ रैखिक रूप से बढ़ रहा है - क्या इस चरण को छोड़ने का कोई तरीका है? या चेकों की पूर्व-गणना करें? या कम से कम मेटास्टोर को केवल एक बार प्रति कॉलम के बजाय प्रति तालिका में एक बार जांचना है?

एक छोटा सा उदाहरण यह है कि जब मैं प्रदर्शन या संग्रह को कॉल करने से पहले भी नीचे चलाता हूं, तो मेटास्टोर चेकर एक बार होता है:

new_table = table.withColumn("new_col1", F.col("col1")

और जब मैं नीचे चलाता हूं, मेटास्टोर चेकर कई बार होता है, और इसलिए अधिक समय लगता है:

new_table = (table
.withColumn("new_col1", F.col("col1")
.withColumn("new_col2", F.col("col2")
.withColumn("new_col3", F.col("col3")
.withColumn("new_col4", F.col("col4")
.withColumn("new_col5", F.col("col5")
)

मेटास्टोर जाँचता है कि यह ड्राइवर नोड में इस तरह दिख रहा है:

20/01/09 11:29:24 INFO HiveMetaStore: 6: get_database: xxx
20/01/09 11:29:24 INFO audit: ugi=root    ip=unknown-ip-addr    cmd=get_database: xxx

डेटाब्रिक्स पर उपयोगकर्ता का विचार है:

Performing Hive catalog operation: databaseExists
Performing Hive catalog operation: tableExists
Performing Hive catalog operation: getRawTable
Running command...

मुझे यह जानने में दिलचस्पी होगी कि क्या कोई पुष्टि कर सकता है कि यह वही तरीका है जो यह काम करता है (प्रति कॉलम मेटास्टोर चेक), और अगर मुझे मेटास्टोर चेक के ऊपरी हिस्से की योजना बनानी है।

3
Louise Fallon 9 जिंदा 2020, 16:48

1 उत्तर

सबसे बढ़िया उत्तर

मैं इस व्यवहार से हैरान हूं क्योंकि यह स्पार्क प्रोसेसिंग मॉडल के साथ फिट नहीं है और मैं इसे स्कैला में दोहरा नहीं सकता। यह संभव है कि यह किसी तरह PySpark के लिए विशिष्ट है, लेकिन मुझे संदेह है कि चूंकि PySpark स्पार्क योजना बनाने के लिए सिर्फ एक API है।

हालाँकि, जो हो रहा है, वह यह है कि प्रत्येक withColumn(...) के बाद योजना का विश्लेषण किया जाता है। यदि योजना बड़ी है, तो इसमें कुछ समय लग सकता है। हालाँकि, एक सरल अनुकूलन है। स्वतंत्र कॉलम के लिए कई withColumn(...) कॉल को df.select(F.col("*"), F.col("col2").as("new_col2"), ...) से बदलें। इस मामले में, केवल एक ही विश्लेषण किया जाएगा।

बहुत बड़ी योजनाओं के कुछ मामलों में, हमने एक नोटबुक सेल के लिए विश्लेषण के 10+ मिनट बचाए हैं।

3
Sim 21 जिंदा 2020, 06:18