Apache spark 火花流卡夫卡文件,每天都在变化?

Apache spark 火花流卡夫卡文件,每天都在变化?,apache-spark,apache-kafka,spark-streaming,Apache Spark,Apache Kafka,Spark Streaming,我有一个卡夫卡流,我将在spark中处理。我想把这个流的输出写入一个文件。但是,我想按天对这些文件进行分区,所以每天它都会开始写入一个新文件。这样的事情可以做吗?我希望它保持运行,当新的一天到来时,它将切换到写入新文件 val streamInputDf = spark.readStream.format("kafka") .option("kafka.bootstrapservers", "XXXX") .opti

我有一个卡夫卡流,我将在spark中处理。我想把这个流的输出写入一个文件。但是,我想按天对这些文件进行分区,所以每天它都会开始写入一个新文件。这样的事情可以做吗?我希望它保持运行,当新的一天到来时,它将切换到写入新文件

val streamInputDf = spark.readStream.format("kafka")
                    .option("kafka.bootstrapservers", "XXXX")
                    .option("subscribe", "XXXX")
                    .load()
val streamSelectDf = streamInputDf.select(...)

streamSelectDf.writeStream.format("parquet)
     .option("path", "xxx")
     ???
基于火花应该能够写一个文件夹的基础上,年,月,日,这似乎正是你正在寻找的。我还没有在spark streaming中尝试过,但希望这个示例能让您走上正确的道路:

df.write.partitionBy("year", "month", "day").format("parquet").save(outPath)
如果没有,您可能可以根据
current\u date()

可以使用中提供的
partitionBy
从spark添加分区
DataFrameWriter
适用于非流式或带 流数据


签名如下:

公共DataFrameWriter分区依据(scala.collection.Seq) (姓名)

DataStreamWriter分区依据(scala.collection.Seq colNames) 按文件系统上的给定列对输出进行分区

DataStreamWriter partitionBy(String…colNames)将 文件系统上给定列的输出

说明: partitionBy公共数据流编写器partitionBy(字符串…colNames) 按文件系统上的给定列对输出进行分区。如果 指定时,输出在文件系统上的布局与配置单元的类似 分区方案。例如,当我们按 年复一年,目录布局如下所示:

- year=2016/month=01/ - year=2016/month=02/ 选项2(使用相同的
分区插入到蜂箱中
):

您还可以插入到配置单元表中,如:

df.write.partitionBy('year', 'month', 'day').insertInto(String tableName)
获取所有配置单元分区:

Spark sql基于配置单元查询语言,因此您可以使用
SHOW PARTITIONS

获取特定表中的分区列表

sparkSession.sql("SHOW PARTITIONS partitionedHiveParquetTable")
结论: 我建议选择2。。。因为它的优点是更晚,所以您可以基于分区查询数据(也称为查询原始数据以了解您收到了什么),底层文件可以是拼花地板或orc

注意:


在使用
SparkSessionBuilder
创建会话时,只需确保已正确配置
.enableHiveSupport()
,并且确保是否已正确配置
hive-conf.xml
等。

为什么不将Kafka中的数据直接使用到Spark中?因为出于审核目的,我们必须像所有其他数据流一样运行此数据流(每天在设定的时间)。因此,我所要做的就是获得数据,然后再进行处理@罗宾莫法特。我想用
.trigger(ProcessingTime(“24小时”)
执行
writeStream
,但我不知道如何将文件写入,以实际更改您提到的卡夫卡,但事实上卡夫卡本身应该充当一个消息总线。如果您使用的是Cloudera/Hortonworks数据流平台,您可以使用NiFi在Kafka之间移动数据,否则您可以使用Spark或Kafka Connect之类的工具来填补此角色。@DennisJaheruddin更正。对不起,我忘了提。我将使用spark将这些数据处理成一个文件。然而,我不确定如何按日期划分邮件,所以当新的一天发生时,文件会被放入一个新文件中(对原始帖子进行小编辑),如果您同意答案,请作为所有者接受!
df.write.partitionBy('year', 'month', 'day').insertInto(String tableName)
sparkSession.sql("SHOW PARTITIONS partitionedHiveParquetTable")