代码之家  ›  专栏  ›  技术社区  ›  Reddspark

类型错误:参数无效,不是字符串或列

  •  -1
  • Reddspark  · 技术社区  · 7 年前

    我做得对吗? 我有一个时间戳列,我将其转换为每月的第一个日期。

    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 回复  |  直到 7 年前
        1
  •  0
  •   Suresh    7 年前

    在这里,

     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)))
    
    推荐文章