将Spark DataFrame保存为Hive表的问题

时间:2018-10-26 14:09:09

标签: python apache-spark hive pyspark

我有两个Spark数据框。其中之一使用HiveContext从hive表中接收:

spark_df1 = hc.sql("select * from testdb.titanic_pure_data_test")    

我从.csv文件获得的第二个spark的数据帧:

lines = sc.textFile("hdfs://HDFS-1/home/testdb/1500000_Sales_Records.csv").map(lambda line: line.split(","))    

spark_df_test = lines.toDF(['Region','Country','Item_Type','Sales_Channel','Order_Priority','Order_Date','Order_ID','Ship_Date','Units_Sold','Unit_Price','Unit_Cost','Total_Revenue','Total_Cost','Total_Profit'])`

我想将任何数据框保存为配置单元表

spark_df1.write.mode("overwrite").format("orc").saveAsTable("testdb.new_res5")

保存的第一个数据帧没有问题,但是当我尝试以相同的方式保存第二个数据帧(spark_df_test)时,出现此错误

  

文件“ /home/jup-user/testdb/scripts/caching.py”,第90行,在       spark_df_test.write.mode(“ overwrite”)。format(“ orc”)。saveAsTable(“ testdbnew_res5”)     文件“ /data_disk/opt/cloudera/parcels/CDH-5.15.1-1.cdh5.15.1.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/sql/readwriter.py”,第435行,在saveAsTable中     文件“ /data_disk/opt/cloudera/parcels/CDH-5.15.1-1.cdh5.15.1.p0.4/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py ”,在致电中,     文件“ /data_disk/opt/cloudera/parcels/CDH-5.15.1-1.cdh5.15.1.p0.4/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py”,第51行,在装饰   pyspark.sql.utils.AnalysisException:'不允许为临时表指定数据库名称或其他限定符。如果表格名称中带有点(。),请在表格名称中加上反引号(`)。;'

1 个答案:

答案 0 :(得分:4)

问题是您试图用不同的数据帧覆盖相同的配置单元表。暂时无法做到这一点。

原因是以下code。这样可以确保该表是否存在引发异常。理想的方法是将数据框保存在新表中

spark_df_test.write.mode("overwrite").format("orc").saveAsTable("testdb.new_res6")

或者您可以使用'insertInto'

spark_df_test.write.mode("overwrite").saveAsTable("temp_table")

然后,您可以覆盖目标表中的行

val tempTable = sqlContext.table("temp_table") 
tempTable
       .write
       .mode("overwrite").insertInto("testdb.new_res5")