क्या मैं इसे ठीक से कर रहा हूं? मेरे पास एक टाइम स्टैम्प कॉलम है जिसे मैं महीने की पहली तारीख में बदल देता हूं।

df= df.withColumn("monthlyTransactionDate", f.trunc(df[transactionDate], 'mon').alias('month'))

मैं फिर इस कोड को चलाता हूं क्योंकि मैं न्यूनतम और अधिकतम तिथियों के बीच सभी संभावित महीनों को उत्पन्न करना चाहता हूं:

import pyspark.sql.functions as f

minDate, maxDate = df.select(f.min("MonthlyTransactionDate"), f.max("MonthlyTransactionDate")).first()


df.withColumn("monthsDiff", f.months_between(maxDate, minDate))\
    .withColumn("repeat", f.expr("split(repeat(',', monthsDiff), ',')"))\
    .select("*", f.posexplode("repeat").alias("date", "val"))\
    .withColumn("date", f.expr("add_months(minDate, date)"))\
    .select('date')\
    .show(n=50)

लेकिन अंतिम खंड की शुरुआत में त्रुटि प्राप्त करें:

TypeError: Invalid argument, not a string or column: 2016-12-01 of type <type 'datetime.date'>. For column literals, use 'lit', 'array', 'struct' or 'create_map' function.
-1
user1761806 31 पद 2018, 23:53

1 उत्तर

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

यहां,

 minDate, maxDate = df.select(f.min("MonthlyTransactionDate"), f.max("MonthlyTransactionDate")).first()  

दिनांक स्वरूप का न्यूनतम और अधिकतम दिनांक मान देता है। सभी पंक्तियों के लिए सटीक मानों का उपयोग करने के लिए, lit() from functions का उपयोग करें

 df.withColumn("monthsDiff", f.months_between(f.lit(maxDate), f.lit(minDate)))
0
Suresh 1 जिंदा 2019, 06:30