将日期字符串传递到 withColumn

Posted

技术标签:

【中文标题】将日期字符串传递到 withColumn【英文标题】:Pass date string into withColumn 【发布时间】:2020-12-22 10:41:23 【问题描述】:

我正在使用 PySpark 并想将 yyyy_mm_dd 字符串作为列添加到我的 DataFrame 中,我尝试过这样做:

end_date = '2020-01-20'
final = (
    df1
    .join(df, on = ['id', 'product'], how = 'left_outer')
    .where((sf.col('id').isNotNull()))
    .withColumn('status', when(sf.col('count') >= 10, 3)
    .when((sf.col('count') <= 9) & (sf.col('count') >= 1), 2)
    .when(sf.col('count').isNull(), 1))
    .withColumn('yyyy_mm_dd', end_date)
)
final.fillna(0, subset=['count']).orderBy('id', 'product').show(500,False)

这在没有最后一个 .withColumn 的情况下有效,但是当我包含它时遇到以下错误:

AssertionError: col 应该是 Column

从docs 看来,我应该将col 作为第二个参数传递给withColumn。不过,我不确定如何将我的日期字符串转换为类型col。我从另一个帖子中看到了这个solution,但我不想使用current_date(),因为我的end_date var 将从协调器脚本中读取。

【问题讨论】:

【参考方案1】:

使用lit:

.withColumn('yyyy_mm_dd', sf.lit(end_date))

如果你想要一个日期类型,你可以相应地转换:

.withColumn('yyyy_mm_dd', sf.lit(end_date).cast("date"))

【讨论】:

【参考方案2】:

请查看 with_column 文档。 它将列名作为第一个参数,将 col 类型作为第二个参数。您可以使用 lit() 将字符串转换为 col 使用 const 值。

pyspark.sql.functions.lit(col) 创建一个文字值列。

df.select(lit(5).alias('height')).withColumn('spark_user', lit(True)).take(1) [行(高度=5,spark_user=True)]

【讨论】:

以上是关于将日期字符串传递到 withColumn的主要内容,如果未能解决你的问题,请参考以下文章

将日期从 HTML 表单传递到 servlet 到 SQL 数据库

如何将日期格式“dd-MMM-yy”的字符串转换为DateType [重复]

传递列表项作为 withColumn (Pyspark) 的输入

在 SparkR 中应用带有正则表达式模式的 withColumn 函数:重新格式化 DataFrame 中的字符串列

使用 withColumn 和 callUDF 将列附加到数据框

将日期时间转换为字符串格式并将其传递给查询