我正在使用Spark Structured流媒体;我的DataFrame具有以下架构
root
|-- data: struct (nullable = true)
| |-- zoneId: string (nullable = true)
| |-- deviceId: string (nullable = true)
| |-- timeSinceLast: long (nullable = true)
|-- date: date (nullable = true)
如何使用Parquet格式执行writeStream并写入数据 (包含zoneId,deviceId,timeSinceLast;除日期以外的所有内容)并按日期对数据进行分区?我尝试了以下代码和partition by子句 不工作
val query1 = df1
.writeStream
.format("parquet")
.option("path", "/Users/abc/hb_parquet/data")
.option("checkpointLocation", "/Users/abc/hb_parquet/checkpoint")
.partitionBy("data.zoneId")
.start()
答案 0 :(得分:2)
如果您想按日期进行分区,则必须在partitionBy()
方法中使用它。
val query1 = df1
.writeStream
.format("parquet")
.option("path", "/Users/abc/hb_parquet/data")
.option("checkpointLocation", "/Users/abc/hb_parquet/checkpoint")
.partitionBy("date")
.start()
如果您要对<year>/<month>/<day>
构成的数据进行分区,则应确保date
列为DateType
类型,然后创建格式相符的列:
val df = dataset.withColumn("date", dataset.col("date").cast(DataTypes.DateType))
df.withColumn("year", functions.date_format(df.col("date"), "YYYY"))
.withColumn("month", functions.date_format(df.col("date"), "MM"))
.withColumn("day", functions.date_format(df.col("date"), "dd"))
.writeStream
.format("parquet")
.option("path", "/Users/abc/hb_parquet/data")
.option("checkpointLocation", "/Users/abc/hb_parquet/checkpoint")
.partitionBy("year", "month", "day")
.start()
答案 1 :(得分:1)
我认为您应该尝试使用可以采用两种参数的方法repartition
:
我建议使用repartition("date")
按日期对数据进行分区。
关于这个主题的一个很棒的链接:https://hackernoon.com/managing-spark-partitions-with-coalesce-and-repartition-4050c57ad5c4