2015-12-11 4 views
5

मैं पीईएसपार्क का उपयोग कर रहा हूं। मेरे पास डेटाफ्रेम ('canon_evt') में एक कॉलम ('डीटी') है जो यह एक टाइमस्टैम्प है। मैं डेटटाइम मान से सेकंड हटाने की कोशिश कर रहा हूं। यह मूल रूप से एक स्ट्रिंग के रूप में लकड़ी की छत से पढ़ा जाता है। मैं फिर इसेपायस्पार्क 1.5 सेकंड्स से निकटतम मिनट में टाइमस्टैम्प को कैसे हटाएं

canon_evt = canon_evt.withColumn('dt',to_date(canon_evt.dt)) 
canon_evt= canon_evt.withColumn('dt',canon_evt.dt.astype('Timestamp')) 

के माध्यम से टिमस्टैम्प में बदलने की कोशिश करता हूं तो मैं सेकंड को हटाना चाहता हूं। मैंने 'trunc', 'date_format' या यहां तक ​​कि नीचे की तरह टुकड़ों को एक साथ जोड़ने की कोशिश की। मुझे लगता है कि इसे किसी प्रकार का नक्शा और लैम्ब्डा संयोजन की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि टाइमस्टैम्प एक उपयुक्त प्रारूप है, और क्या सेकंड से छुटकारा पाना संभव है या नहीं।

canon_evt = canon_evt.withColumn('dyt',year('dt') + '-' + month('dt') + 
    '-' + dayofmonth('dt') + ' ' + hour('dt') + ':' + minute('dt')) 

[Row(dt=datetime.datetime(2015, 9, 16, 0, 0),dyt=None)] 
+0

क्या आप पोस्टक्वेट से पढ़ते समय यह कैसे देख सकते हैं? – WoodChopper

+0

[पंक्ति (डीटी = '2015-09-16 05:39:46')], पंक्ति (डीटी = '2015-09-16 05:40:46')] – PR102012

+0

'शून्य323', सुपर त्वरित के लिए धन्यवाद मदद! – PR102012

उत्तर

6

यूनिक्स टाइमस्टैम्प और चाल करना चाहिए बुनियादी arithmetics में कनवर्ट कर रहा:

from pyspark.sql import Row 
from pyspark.sql.functions import col, unix_timestamp, round 

df = sc.parallelize([ 
    Row(dt='1970-01-01 00:00:00'), 
    Row(dt='2015-09-16 05:39:46'), 
    Row(dt='2015-09-16 05:40:46'), 
    Row(dt='2016-03-05 02:00:10'), 
]).toDF() 


## unix_timestamp converts string to Unix timestamp (bigint/long) 
## in seconds. Divide by 60, round, multiply by 60 and cast 
## should work just fine. 
## 
dt_truncated = ((round(unix_timestamp(col("dt"))/60) * 60) 
    .cast("timestamp")) 

df.withColumn("dt_truncated", dt_truncated).show(10, False) 
## +-------------------+---------------------+ 
## |dt     |dt_truncated   | 
## +-------------------+---------------------+ 
## |1970-01-01 00:00:00|1970-01-01 00:00:00.0| 
## |2015-09-16 05:39:46|2015-09-16 05:40:00.0| 
## |2015-09-16 05:40:46|2015-09-16 05:41:00.0| 
## |2016-03-05 02:00:10|2016-03-05 02:00:00.0| 
## +-------------------+---------------------+ 
+0

यदि मेरे पास केवल स्पार्क 1.3 तक पहुंच थी, और इसलिए कोई 'unix_timestamp' फ़ंक्शन नहीं है, तो क्या स्पार्क एसक्यूएल या डेटाफ्रेम में अभी भी प्रदर्शन करना आसान होगा? – PR102012

+0

बस [हाइव यूडीएफ] का उपयोग करें (https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions) – zero323

1

मुझे लगता है कि zero323 सर्वश्रेष्ठ उत्तर है। यह बहुत परेशान है कि स्पार्क इस मूल रूप से समर्थन नहीं करता है, यह लागू करना कितना आसान है। वंशावली के लिए, यहां एक फ़ंक्शन है जिसका उपयोग मैं करता हूं:

def trunc(date, format): 
    """Wraps spark's trunc fuction to support day, minute, and hour""" 
    import re 
    import pyspark.sql.functions as func 

    # Ghetto hack to get the column name from Column object or string: 
    try: 
     colname = re.match(r"Column<.?'(.*)'>", str(date)).groups()[0] 
    except AttributeError: 
     colname = date 

    alias = "trunc(%s, %s)" % (colname, format) 

    if format in ('year', 'YYYY', 'yy', 'month', 'mon', 'mm'): 
     return func.trunc(date, format).alias(alias) 
    elif format in ('day', 'DD'): 
     return func.date_sub(date, 0).alias(alias) 
    elif format in ('min',): 
     return ((func.round(func.unix_timestamp(date)/60) * 60).cast("timestamp")).alias(alias) 
    elif format in ('hour',): 
     return ((func.round(func.unix_timestamp(date)/3600) * 3600).cast("timestamp")).alias(alias) 
+0

धन्यवाद! आपके जवाब ने मुझे वही दिया जो मैं खोजना चाहता था। – Paul

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