2015-10-08 6 views
7

क्या कई बार dataFrame.withColumnRenamed() पर कॉल करने के बजाय दिए गए स्पार्कएसक्यूएल DataFrame के एक ही समय में सभी या एकाधिक कॉलम का उपसर्ग या नाम बदलने का कोई अच्छा तरीका है?स्पार्क डेटाफ्रेम और कई कॉलम का नाम बदलना (जावा)

एक उदाहरण होगा यदि मैं परिवर्तनों का पता लगाना चाहता हूं (पूर्ण बाहरी शामिल होने का उपयोग कर)। तब मुझे एक ही संरचना के साथ दो DataFrame एस के साथ छोड़ दिया गया है।

उत्तर

6

मैं इसे करने के लिए चयन() विधि का उपयोग करने का सुझाव देता हूं। वास्तव में CollumnRenamed() विधि के साथ चयन() स्वयं का उपयोग करता है। यहाँ उदाहरण कैसे एकाधिक स्तंभों का नाम बदलने के लिए है:

import org.apache.spark.sql.functions._ 

val someDataframe: DataFrame = ... 

val initialColumnNames = Seq("a", "b", "c") 
val renamedColumns = initialColumnNames.map(name => col(name).as(s"renamed_$name")) 
someDataframe.select(renamedColumns : _*) 
+0

यह जावा एपीआई और स्पार्क के बारे में अधिक है। एक उदाहरण के रूप में 'चयन' या तो एक स्ट्रिंग पैरामीटर की अपेक्षा करता है और उसके बाद 'कॉलम' के varargs या सरणी जो संगत नहीं है और कभी-कभी उपयोग करने के लिए थोड़ा परेशान भी होती है। मुझे इस समस्या से निपटने के लिए कुछ सहायक तरीके बनाना पड़ा, लेकिन उन तरीकों को सीधे 'डेटाफ्रेम' में उपलब्ध करना बेहतर होगा। – JiriS

+0

एक और उदाहरण है [यहां] (http://stackoverflow.com/questions/32535273/how-to-match-dataframe-column-names-to-scala-case-class-attributes) –

+0

क्या आपने अपना कोड आजमाया स्पार्क 2.0? मैं 7000 कॉलम से निपट रहा हूं, https://github.com/ramhiser/datamicroarray/wiki/Golub-(1999 देखें)। यह हमेशा के लिए लेता है (= मेरे धैर्य खत्म होने से पहले कभी खत्म नहीं हुआ)। – Boern

0

मैं heve सिर्फ जवाब

df1_r = df1.select(*(col(x).alias(x + '_df1') for x in df1.columns)) 
stackoverflow here पर

(स्वीकार किए जाते हैं जवाब के अंत देखें)

-1

हालांकि यह जवाब नहीं देता पाया अपने सीधे सवाल करें, लेकिन मैं हमेशा स्तंभ नामों को एक-एक करके अद्यतन करता हूं। यह केवल तभी अपडेट DF मेटाडाटा के बाद से, एक के बाद एक को अद्यतन करने के स्तंभ नाम पर कोई नुकसान (कोई प्रदर्शन प्रभाव), उदा .:

for c in DF.columns: 
    new_c = c.strip().replace(' ','_') 
    DF = DF.withColumnRenamed(c, new_c) 
+0

कोई नुकसान नहीं? क्या आपने सैकड़ों कॉलम के लिए यह कोशिश की? मैंने किया और नौकरी तीन घंटों के बाद एक स्टैक ओवरफ्लो त्रुटि के साथ विफल रही। स्वीकृत उत्तर के बजाय तुरंत सैकड़ों कॉलम का नाम बदलना पड़ा। –

+0

हां मैंने परीक्षण किया था। कौन सा स्पार्क संस्करण? मैंने 700 + कॉलम वाले टेबल पर इसका इस्तेमाल किया। स्पार्क 1.5/सीडीएच 5.5 में। दोबारा, DF.withColumnRenamed बस डीएफ के मेटाडेटा को अपडेट करता है, इसलिए यह बहुत तेज़ है। क्या आप वाकई वह हिस्सा है जो आपको स्टार्ट ओवरफ्लो देता है? यह एक स्पार्क बग हो सकता है जिसे आप चल रहे हैं। कृपया पूरा कोड लिखें। मुझे यकीन है कि कोड काम करता है, मैंने इसे अपनी उत्पादन नौकरियों में इस्तेमाल किया। – Tagar

+0

मैंने जावा के बजाय 'स्पार्क 1.6.2' और स्कैला का उपयोग किया। क्या डेटाफ्रेम जावा में उत्परिवर्तनीय हैं और यह प्रत्येक पुनरावृत्ति के साथ एक नया उदाहरण नहीं बनाता है? यदि ऐसा है, तो यह समझाएगा कि यह आपके लिए क्यों काम करता है। –

0
or (a <- 0 to newsales.columns.length - 1) 
{ 
var new_c = newsales.columns(a).replace('(','_').replace(')',' ').trim 
newsales_var = newsales.withColumnRenamed(newsales.columns(a),new_c) 
} 
+0

कृपया अधिक जानकारी के साथ संपादित करें। केवल कोड और "इसे आज़माएं" उत्तर निराश हैं, क्योंकि उनमें कोई खोज योग्य सामग्री नहीं है, और यह समझाएं कि किसी को "इसे आजमाएं" क्यों चाहिए। हम ज्ञान के लिए संसाधन बनने के लिए यहां एक प्रयास करते हैं। – abarisone

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