scala Spark Partitionby时间戳到年月日期,无需添加列

bgtovc5b  于 6个月前  发布在  Scala
关注(0)|答案(1)|浏览(96)

我正在尝试根据timestamp列对spark job的delta输出进行分区。我的框架有2列:

userid, last_login
1234, "2023-11-25T05:22:13.433Z"
5678, "2023-11-26T05:22:12.123Z"

字符串
我不想在输出增量和最后一步中添加额外的列,而我正在使用write &保存编写输出:

dataframe.wite.format("delta").partitionBy("year", "month", "day").save("my_location")


有没有什么方法可以让我在运行中创建yyyy,mm,dd?我使用spark scala来完成这项工作。
我尝试使用相同的代码rame.wite.format(“delta”).partitionBy(“year”,“month”,“day”).保存(“my_location”),但它对我不起作用,并说列未找到错误。

i2byvkas

i2byvkas1#

您需要指定年、月和日。

dataframe
  .select(
    $"userid",
    $"last_login",
    year($"last_login").as("year"),
    month($"last_login").as("month"),
    dayofmonth($"last_login").as("day")
  )
  .write.format("delta").partitionBy("year", "month", "day").save("my_location")

字符串
它不能比这更“在飞行中”。
我怀疑你可能关心的是这些列是否会被保存到parquet文件中,浪费空间。不,它们不会。输出将类似于这样:

your_table/
  year=2023/
    month=10/
      day=26/
        part-0000-blah.parquet
        part-0001-blah.parquet
      day=27/
        part-0000-blah.parquet
        part-0001-blah.parquet


这些parquet文件将只包含useridlast_login列。分区值存储在目录结构中,当阅读数据时,它们将简单地从路径重建。

相关问题