繁体   English   中英

Spark结构化流中的镶木地板数据和分区问题

[英]Parquet data and partition issue in Spark Structured streaming

我正在使用Spark结构化流; 我的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() 

如果要按日期分区,则必须在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()

我认为您应该尝试可以采用两种参数的方法repartition

  • 栏名
  • 所需分区的数量。

我建议使用repartition("date")按日期对数据进行分区。

关于这个主题的绝佳链接: https : //hackernoon.com/managing-spark-partitions-with-coalesce-and-repartition-4050c57ad5c4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM