2016-05-05 13 views
5

पर दो कॉलम की डेटडिफ मेरे पास डेटाफ्रेम में दो टाइमस्टैम्प कॉलम हैं जिन्हें मैं मिनट का अंतर, या वैकल्पिक रूप से, घंटे का अंतर प्राप्त करना चाहता हूं। वर्तमान में मैं राउंडिंग के साथ, दिन का अंतर प्राप्त करने के लिए,स्पार्क स्कैला: घंटे या मिनट

val df2 = df1.withColumn("time", datediff(df1("ts1"), df1("ts2"))) 

कर हालांकि, जब मैं दस्तावेज़ पेज https://issues.apache.org/jira/browse/SPARK-8185 मैं नहीं देखा था किसी भी अतिरिक्त पैरामीटर इकाई को बदलने के लिए को देखा द्वारा सक्षम हूं। क्या उनके लिए एक अलग कार्य है जिसका उपयोग करना चाहिए?

उत्तर

9

आप द्वारा

import org.apache.spark.sql.functions._ 
val diff_secs_col = col("ts1").cast("long") - col("ts2").cast("long") 

सेकंड में अंतर मिलता है तो फिर तुम इकाई आप चाहते हैं पाने के लिए कुछ गणित कर सकते हैं कर सकते हैं।

val df2 = df1 
    .withColumn("diff_secs", diff_secs_col) 
    .withColumn("diff_mins", diff_secs_col/60D) 
    .withColumn("diff_hrs", diff_secs_col/3600D) 
    .withColumn("diff_days", diff_secs_col/(24D * 3600D)) 

या pyspark में,: उदाहरण के लिए:

from pyspark.sql.functions import * 
diff_secs_col = col("ts1").cast("long") - col("ts2").cast("long") 

df2 = df1 \ 
    .withColumn("diff_secs", diff_secs_col) \ 
    .withColumn("diff_mins", diff_secs_col/60D) \ 
    .withColumn("diff_hrs", diff_secs_col/3600D) \ 
    .withColumn("diff_days", diff_secs_col/(24D * 3600D)) 
0

जवाब डैनियल डे पाउला काम करता है, लेकिन यह है कि समाधान द्वारा दिए गए इस मामले में जहां अंतर प्रत्येक पंक्ति के लिए आवश्यक है में काम नहीं करता आपकी मेज में

import org.apache.spark.sql.functions 

val df2 = df1.selectExpr("(unix_timestamp(ts1) - unix_timestamp(ts2))/3600") 

यह पहली, सेकंड में एक यूनिक्स टाइमस्टैम्प के कॉलम में डेटा धर्मान्तरित उन्हें घटा देती है और उसके बाद घंटे के लिए अंतर धर्मान्तरित: यहाँ एक समाधान है कि क्या करेंगे कि प्रत्येक पंक्ति के लिए है।

कार्यों की एक उपयोगी सूची

पाया जा सकता है पर: http://spark.apache.org/docs/latest/api/scala/#org.apache.spark.sql.functions $

+1

मेरे समाधान DataFrame में हर पंक्ति के लिए अंतर का परिकलन करेंगे। यदि इसमें कोई समस्या है तो कृपया अधिक विशिष्ट रहें। इसके अलावा, आपके समाधान के लिए, मेरा मानना ​​है कि स्ट्रिंग एक्सप्रेशन से बचना बेहतर होगा (परीक्षण करना कठिन है और अधिक त्रुटि प्रवण है): 'val df2 = df1.select ((unix_timestamp (ts1) - unix_timestamp (ts2))/3600D)' । –

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