6

here के समान प्रश्न, लेकिन वहां टिप्पणी करने के लिए पर्याप्त अंक नहीं हैं। नवीनतम स्पार्क documentation के अनुसार एक udf() का उपयोग दो अलग-अलग तरीकों से किया जा सकता है, एक एसक्यूएल के साथ और दूसरा डेटाफ्रेम के साथ। मुझे एसक्यूएल के साथ udf() का उपयोग करने के तरीके के बारे में कई परीक्षा मिली, लेकिन किसी डेटाफ्रेम पर सीधे udf() का उपयोग करने के तरीके पर कोई भी नहीं मिला है। ओपी द्वारा प्रदान किया गया समाधान ऊपर दिए गए प्रश्न पर कॉलयूडीएफ() है जो को हटा दिया गया है और स्पार्क जावा एपीआई दस्तावेज के अनुसार स्पार्क 2.0 में हटा दिया जाएगा। वहां, यह कहता है "चूंकि यह udf()" के साथ अनावश्यक है, इसलिए इसका मतलब है कि मैं अपने udf() को कैल करने के लिए udf() का उपयोग करने में सक्षम होना चाहिए, लेकिन यह पता नहीं लगा सकता कि यह कैसे करें। मुझे जावा से स्पार्क का उपयोग करने के लिए बहुत अपरिवर्तनीय लग रहा है .. हर कदम पर अंतहीन गुगलिंग सिर्फ यह पता लगाने के लिए कि कैसे स्पष्ट संचालन करना है .. हर कदम पर दर्द दर्द अगले दर्द पर कम दर्द को कम नहीं करता है !! मैंने जावा-स्पार्क कार्यक्रमों के लिए वाक्यविन्यास का कुछ ऐसा करने पर ठोकर नहीं लगाया है। मैं क्या खो रहा हूँ?मैं जावा का उपयोग कर स्पार्क डेटाफ्रेम पर यूडीएफ कैसे कॉल करूं?

import org.apache.spark.sql.api.java.UDF1; 
. 
.  
UDF1 mode = new UDF1<String[], String>() { 
    public String call(final String[] types) throws Exception { 
     return types[0]; 
    } 
}; 
sqlContext.udf().register("mode", mode, DataTypes.StringType); 
df.???????? how do I call my udf (mode) on a given column of my DataFrame df? 
+0

वोट क्यों नीचे? – Kai

+0

यह नहीं है। ध्यान से हस्ताक्षर जांचें :) कुछ उदाहरण कोड? यूडीएफ + डेटा? कुछ स्वरूपण? – zero323

+0

जो मैं पूछ रहा हूं उसे स्पष्ट करने के लिए कोड जोड़ा गया। शिकायत करने वाले हिस्से के लिए, मुझे एक घबराहट महसूस हो रही है कि मैं इसे सही नहीं कर रहा हूं। जावा-स्पार्क में चीजों को कैसे करना है, यह जानने में घंटों का समय नहीं लगना चाहिए। मुझे लगता है कि मुझे कुछ याद आ रही है, कुछ किताबें, कुछ दस्तावेज कहीं, ज्ञान का कुछ स्रोत जो मुझे अपने आईडीई से मिलने वाले संकेतों को घंटों तक Google के बिना काम करने के लिए पर्याप्त बनाता है। मुझे जो कुछ भी मिलता है वह स्कैला है और यह बिल्कुल स्पष्ट नहीं है कि जावा में एक ही चीज कैसे करें। – Kai

उत्तर

8

यहां तक ​​कि अगर हम मानते हैं कि अपने यूडीएफ उपयोगी है और एक सरल getItem कॉल यह गलत हस्ताक्षर है से बदला नहीं जा सकता। सरणी कॉलम स्काला WrappedArray नहीं सादे जावा सरणी का उपयोग कर सामने आ रहे हैं ताकि आप हस्ताक्षर समायोजित करना:

UDF1 mode = new UDF1<Seq<String>, String>() { 
    public String call(final Seq<String> types) throws Exception { 
    return types.apply(0); 
    } 
}; 

तो यूडीएफ पहले से पंजीकृत है:

sqlContext.udf().register("mode", mode, DataTypes.StringType); 

आप बस उपयोग कर सकते हैं (एक नया कार्य है जो 1.5 से प्रारंभ) नाम से इसे कहते हैं:

df.select(callUDF("mode", col("vs"))).show(); 

आप भी इसे selectExprs में उपयोग कर सकते हैं:

01,235,
df.selectExpr("mode(vs)").show(); 
+0

सबसे पहले, धन्यवाद। Udf को थोड़ा सा सरल बनाया गया है, जिसे मैं लिखना समाप्त कर दूंगा, एक सिंगल स्ट्रिंग लौटाएगा जो कॉलम में स्ट्रिंग सरणी का एक फ़ंक्शन है (पंक्ति द्वारा पंक्ति, कोई समेकन नहीं)। यह spark.sql.functions सूट में उन कार्यों में से एक के लिए एक आदर्श मामला प्रतीत होता था, लेकिन मुझे जो चाहिए (स्ट्रिंग सरणी में सबसे अधिक बार आइटम) वहां नहीं है, इसलिए मैं अपना खुद का udf() विकसित करने की कोशिश कर रहा हूं। – Kai

+0

अब मैं देख सकता हूं कि मैं callUDF() के बजाय callUdf() को देख रहा था। callUdf() एक को छोड़ दिया गया है और स्पार्क 2.0 में हटाया जाना है। – Kai

+0

असल में 'कॉलयूडीएफ' के कुछ रूपों को भी बहिष्कृत किया गया है। – zero323

संबंधित मुद्दे