2016-08-22 6 views
8

में परिवर्तित करता है मैं स्पार्क 1.5.0 के माध्यम से पीईएसपार्क का उपयोग कर रहा हूं। मेरे पास डेटाटाइम मानों के लिए कॉलम की पंक्तियों में असामान्य स्ट्रिंग प्रारूप है। यह इस तरह दिखता है:पायस्पार्क डेटाफ्रेम असामान्य स्ट्रिंग प्रारूप को टाइमस्टैम्प

Row[(daytetime='2016_08_21 11_31_08')] 

वहाँ एक रास्ता एक टाइमस्टैम्प में इस अपरंपरागत yyyy_mm_dd hh_mm_dd प्रारूप कन्वर्ट करने के लिए है? कुछ है कि अंततः

df = df.withColumn("date_time",df.daytetime.astype('Timestamp')) 

की तर्ज पर आ सकता है मैंने सोचा था regexp_replace की तरह है कि स्पार्क एसक्यूएल कार्यों काम कर सकता था, लेकिन निश्चित रूप से मैं तारीख आधा और _: साथ में - साथ _ प्रतिस्थापित करने की आवश्यकता समय हिस्सा मैं सोच रहा था कि मैं substring का उपयोग करके कॉलम को 2 में विभाजित कर सकता हूं और समय के अंत से पिछड़ा हुआ हूं। फिर 'regexp_replace' अलग से करें, फिर concatenate। लेकिन यह कई परिचालनों में प्रतीत होता है? क्या कोई आसान तरीका है?

उत्तर

15

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

from pyspark.sql.functions import to_timestamp 

(sc 
    .parallelize([Row(dt='2016_08_21 11_31_08')]) 
    .toDF() 
    .withColumn("parsed", to_timestamp("dt", "yyyy_MM_dd hh_mm_ss")) 
    .show(1, False)) 

## +-------------------+-------------------+ 
## |dt     |parsed    | 
## +-------------------+-------------------+ 
## |2016_08_21 11_31_08|2016-08-21 11:31:08| 
## +-------------------+-------------------+ 

स्पार्क < 2,2

यह कुछ भी नहीं है कि unix_timestamp को संभाल नहीं कर सकते हैं:

from pyspark.sql import Row 
from pyspark.sql.functions import unix_timestamp 

(sc 
    .parallelize([Row(dt='2016_08_21 11_31_08')]) 
    .toDF() 
    .withColumn("parsed", unix_timestamp("dt", "yyyy_MM_dd hh_mm_ss") 
    .cast("double") 
    .cast("timestamp")) 
    .show(1, False)) 

## +-------------------+---------------------+ 
## |dt     |parsed    | 
## +-------------------+---------------------+ 
## |2016_08_21 11_31_08|2016-08-21 11:31:08.0| 
## +-------------------+---------------------+ 
+0

इसलिए मैं वास्तव में नहीं मिल रहा है सही परिणाम: ................................ df1 = df1.with कॉलम ("dayte_time", unix_timestamp ("डेटटाइम", "yyyy_MM_dd hh_mm_ss")। कास्ट ("टाइमस्टैंप")) df1 = df1.with कॉलम ("date_time", df1.dayte_time.astype ("स्ट्रिंग")) ---------- -------------------------------------------------- -------------------- [पंक्ति (दिन का समय = '2016_08_22 23_18_51', idnbr = 223338299392, dayte_time = datetime.datetime (1 9 70, 1, 18, 0, 51 , 47, 931000), date_time = '1970-01-18 00: 51: 47.931') – PR102012

+0

क्षमा करें, मैं भूल रहा हूं कि 1.5 छोटी थी। '.cast (" टाइमस्टैंप ") से पहले 1000 से दोगुना या गुणा करने के लिए डाला गया ' – zero323

+0

हां, सही। '.cast ("डबल")' आगे काम किया। – PR102012

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