2016-04-29 4 views
12

मेरे पास एक डेटाफ्रेम है जिसमें दो कॉलम (सी, डी) स्ट्रिंग कॉलम प्रकार के रूप में परिभाषित किए गए हैं, लेकिन कॉलम में डेटा वास्तव में तिथियां हैं। उदाहरण के लिए कॉलम सी की तारीख "01-एपीआर-2015" और कॉलम डी "20150401" है, इसलिए मैं इन्हें दिनांक कॉलम प्रकार में बदलना चाहता हूं, लेकिन मुझे ऐसा करने का अच्छा तरीका नहीं मिला। मैं स्टैक ओवरफ़्लो को देखता हूं, मुझे स्प्रिंग कॉलम प्रकार को स्पार्क एसक्यूएल के डेटाफ्रेम में दिनांक कॉलम प्रकार में बदलने की आवश्यकता है। दिनांक स्वरूप हो सकता है "01-APR-2015" और मैं this post को देखो, लेकिन यह जानकारी नहीं थी तिथि से संबंधितडेटाफ्रेम में स्ट्रिंग से दिनांक तक कॉलम प्रकार को कैसे बदला जाए?

उत्तर

30

स्पार्क> = 2,2

आप to_date उपयोग कर सकते हैं:

import org.apache.spark.sql.functions.{to_date, to_timestamp} 

df.select(to_date($"ts", "dd-MMM-yyyy").alias("date")) 

या to_timestamp:

df.select(to_date($"ts", "dd-MMM-yyyy").alias("timestamp")) 

मध्यवर्ती unix_timestamp कॉल के साथ।

स्पार्क < 2,2

स्पार्क 1.5 जब से तुम unix_timestamp समारोह का उपयोग कर सकते, लंबे समय के लिए स्ट्रिंग पार्स यह कास्ट करने के लिए टाइमस्टैम्प और to_date काटना:

import org.apache.spark.sql.functions.{unix_timestamp, to_date} 

val df = Seq((1L, "01-APR-2015")).toDF("id", "ts") 

df.select(to_date(unix_timestamp(
    $"ts", "dd-MMM-yyyy" 
).cast("timestamp")).alias("timestamp")) 

नोट:

स्पार्क संस्करण के आधार पर आपको SPARK-11724 के कारण कुछ समायोजन की आवश्यकता हो सकती है :

पूर्णांक प्रकार से टाइमस्टैम्प कास्टिंग स्रोत int को मिलिस में होने का व्यवहार करता है। टाइमस्टैंप से पूर्णांक प्रकारों तक कास्टिंग परिणाम सेकंड में बनाता है।

आप पैच न किया गया संस्करण unix_timestamp उत्पादन का उपयोग करते हैं से गुणा की आवश्यकता है 1000

+0

मेरे संपादन अस्वीकार कर दिया गया है, लेकिन मैं बहुत यकीन है कि वहाँ एक "}" अपना पहला आयात लाइन में लापता है और आप "TO_DATE" लिखा हूँ लाइन 7 "to_timestamp" के बजाय – Fabich

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