我有一个用sparksql用以下示例代码编写的api端点。每次api接受请求时,它将运行sparkSession.sql(sql_to_hive),这将在HDFS中创建一个文件。有什么方法可以通过将数据附加到HDFS中的现有文件来进行插入?谢谢。
sqlContext = SQLContext(sparkSession.sparkContext)
df = sqlContext.createDataFrame(ziped_tuple_list, schema=schema)
df.registerTempTable('TMP_TABLE')
sql_to_hive = 'insert into log.%(table_name)s partition%(partition)s select %(title_str)s from TMP_TABLE'%{
'table_name': table_name,
'partition': partition_day,
'title_str': title_str
}
sparkSession.sql(sql_to_hive)
答案 0 :(得分:0)
我认为不可能将数据追加到现有文件中。
但是您可以通过以下两种方法之一解决此问题
方法1
Using Spark, write to intermediate temporary table and then insert overwrite to final table:
existing_df=spark.table("existing_hive_table") //get the current data from hive
current_df //new dataframe
union_df=existing_df.union(current_df)
union_df.write.mode("overwrite").saveAsTable("temp_table") //write the data to temp table
temp_df=spark.table("temp_table") //get data from temp table
temp_df.repartition(<number>).write.mode("overwrite").saveAsTable("existing_hive_table") //overwrite to final table
方法2:
Hive(not spark)
提供覆盖并选择相同的表。即
insert overwrite table default.t1 partition(partiton_column)
select * from default.t1; //overwrite and select from same t1 table
如果您采用这种方式,那么当火花作业完成后,就需要触发一个蜂巢作业。
Hive在覆盖/选择同一张表时将获得锁定,因此如果有任何正在写入表的作业将等待。
In Addition:
Orc format
将提供alter table concatenate,它将合并较小的ORC文件以创建新的较大文件。
alter table <db_name>.<orc_table_name> [partition_column="val"] concatenate;
我们还可以使用distributeby,sortby clauses
控制文件数量,请参阅this和this链接以获取更多详细信息。
另一种 Approach3 是通过使用hadoop fs -getMerge将所有小文件合并为一个文件(此方法works
用于text files
和{ {1}}(用于 orc,avro ..etc格式)。
答案 1 :(得分:0)
写入结果数据框时:
result_df = sparkSession.sql(sql_to_hive)
设置添加模式:
result_df.write.mode( SaveMode.Append )。