使用Date列写入分区Java-Spark

时间:2018-08-07 09:01:14

标签: apache-spark hive hdfs

我正在使用Java-Spark。

我正在尝试按日期分区列写入Hive表, 我正在尝试的是:

Dataset<Row> ds = dataframe.select(cols).withColumn("load_date", function.lit("08.07.2018").cast("date"));
ds.write().mode(mode).partitionBy("load_date").save(hdfsDirectory);

运行下面的行后,我在hdfs中看到以下目录:

/load_date=__HIVE_DEFAULT_PARTITION__

表示空值。

那我怎么按日期写分区?

谢谢。

2 个答案:

答案 0 :(得分:1)

要使用cast日期,必须采用标准格式(年-月-日)

Dataset<Row> ds = dataframe.select(cols).withColumn("load_date", function.lit("2018-07-08").cast("date"));

否则,请使用o.a.s.sql.functions.to_date函数并提供与SimpleDateFormat兼容的格式

答案 1 :(得分:1)

更简单的方法是使用以下功能

from_unixtime(unix_timestamp('2016/06/01','yyyy/MM/dd'),'yyyyMMdd')

我更喜欢使用spark sql实现此目的

ds.createOrUpdateTempTable("tempTable")
val dsWithLoadDate = spark.sql("select *, from_unixtime(unix_timestamp('2016/06/01','yyyy/MM/dd'),'yyyyMMdd') as load_date from tempTable")

dsWithLoadDate.write().mode(mode).partitionBy("load_date").save(hdfsDirectory);