Apache spark 如何在sparksql中进行追加插入?

Apache spark 如何在sparksql中进行追加插入?,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,我有一个由sparksql编写的api端点,它带有以下示例代码。每次api接受一个请求时,它都会运行sparkSession.sql(sql_to_配置单元),这将在HDFS中创建一个文件。有没有办法通过将数据附加到HDFS中的现有文件来执行insert?谢谢 sqlContext = SQLContext(sparkSession.sparkContext) df = sqlContext.createDataFrame(ziped_tuple_list, schema=sch

我有一个由sparksql编写的api端点,它带有以下示例代码。每次api接受一个请求时,它都会运行sparkSession.sql(sql_to_配置单元),这将在HDFS中创建一个文件。有没有办法通过将数据附加到HDFS中的现有文件来执行insert?谢谢

    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)

我认为在这种情况下不可能将数据附加到现有文件中

但是你可以通过以下两种方法来解决这个问题

方法1

使用Spark,写入中间临时表,然后插入覆盖到最终表:

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
如果您遵循这种方式,则需要在spark作业完成后触发蜂巢作业

配置单元将在运行覆盖/选择同一个表时获取锁,以便任何正在写入表的作业都将等待

此外:
Orc格式将提供合并小Orc文件以创建新的更大文件的功能

 alter table <db_name>.<orc_table_name> [partition_column="val"] concatenate;
altertable。[partition_column=“val”]连接;
我们还可以使用
distributeby,sortby子句
来控制文件的数量,有关详细信息,请参阅和链接


另一种方法3是使用将所有小文件合并为一个文件(这种方法
适用于
文本文件
我没有尝试过orc、avro等格式)。

当您编写生成的数据帧时:

result\u df=sparkSession.sql(sql\u到\u配置单元)

将其模式设置为附加:

结果_df.write.mode(SaveMode.Append

 alter table <db_name>.<orc_table_name> [partition_column="val"] concatenate;