मेरे पास एक स्पार्क डेटाफ्रेम है जिसमें टाइमस्टैम्प की एक सूची है (यूआईडी द्वारा विभाजित, टाइमस्टैम्प द्वारा आदेशित)। अब, मैं पिछले या अगले रिकॉर्ड को प्राप्त करने के लिए डेटाफ्रेम से पूछताछ करना चाहता हूं।

df = myrdd.toDF().repartition("uid").sort(desc("timestamp")) 
df.show()
+------------------------+-------+
|uid         |timestamp          |
+------------------------+-------+
|Peter_Parker|2020-09-19 02:14:40|
|Peter_Parker|2020-09-19 01:07:38|
|Peter_Parker|2020-09-19 00:04:39|
|Peter_Parker|2020-09-18 23:02:36|
|Peter_Parker|2020-09-18 21:58:40|

तो उदाहरण के लिए यदि मुझे पूछना था:

ts=datetime.datetime(2020, 9, 19, 0, 4, 39) 

मैं पिछला रिकॉर्ड (2020-09-18 23:02:36) पर प्राप्त करना चाहता हूं, और केवल एक। मैं पिछला कैसे प्राप्त कर सकता हूं? कॉलम() और diff का उपयोग करके इसे करना संभव है, लेकिन क्या ऐसा करने का एक और अधिक कुशल तरीका है? मुझे वास्तव में सभी घटनाओं के लिए अंतर की गणना करने की आवश्यकता नहीं है, क्योंकि यह पहले से ही आदेश दिया गया है। मुझे सिर्फ पिछला/अगला रिकॉर्ड चाहिए।

0
Ruslan 2 फरवरी 2021, 11:27

2 जवाब

सबसे बढ़िया उत्तर

आप इसके द्वारा फ़िल्टर और क्रम का उपयोग कर सकते हैं, और फिर परिणामों को 1 पंक्ति तक सीमित कर सकते हैं:

df2 = (df.filter("uid = 'Peter_Parker' and timestamp < timestamp('2020-09-19 00:04:39')")
         .orderBy('timestamp', ascending=False)
         .limit(1)
      )

df2.show()
+------------+-------------------+
|         uid|          timestamp|
+------------+-------------------+
|Peter_Parker|2020-09-18 23:02:36|
+------------+-------------------+
1
mck 2 फरवरी 2021, 11:33

या फ़िल्टर करने के बाद row_number का उपयोग करके:

from pyspark.sql import Window
from pyspark.sql import functions as F


df1 = df.filter("timestamp < '2020-09-19 00:04:39'") \
        .withColumn("rn", F.row_number().over(Window.orderBy(F.desc("timestamp")))) \
        .filter("rn = 1").drop("rn")

df1.show()

#+------------+-------------------+
#|         uid|          timestamp|
#+------------+-------------------+
#|Peter_Parker|2020-09-18 23:02:36|
#+------------+-------------------+
0
blackbishop 2 फरवरी 2021, 11:51