如何在sparksql中追加插入?

时间:2019-05-28 14:23:12

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我有一个用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)

2 个答案:

答案 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控制文件数量,请参阅thisthis链接以获取更多详细信息。

另一种 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 )。