python - 将 spark DataFrame 保存为 Hive 表的问题
问题描述
我有两个 spark 的数据框。其中一个使用 HiveContext 从 hive 表中收到:
spark_df1 = hc.sql("select * from testdb.titanic_pure_data_test")
我从.csv
文件中获得的第二个火花数据框:
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("
testdb
.new_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” ,第 1257 行,通话中 文件“/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 行, 在 deco pyspark.sql.utils.AnalysisException: '指定数据库名称或其他限定符不允许用于临时表。如果表名中包含点 (.),请用反引号 (`) 引用表名。;'
解决方案
问题是您试图用不同的数据框覆盖同一个配置单元表。这现在不能在 spark 中完成。
原因是下面的代码。这确保了表是否存在以引发异常。理想的方法是将数据框保存在新表中
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")
推荐阅读
- android - 在android中的键盘上方显示动态edittext
- python - Django 不发送服务器错误(500)电子邮件
- excel - 从子例程运行工作表事件
- c# - 将 Linq 结果转换为 JSON 数组
- css - 我尝试使用浮动来定位一些文本,但它甚至没有移动
- sql - 如何在数据库中为每个主题获取最小和最大日期
- mysql - MariaDB 查询两个字段中的最大值和最小值
- php - docker-compose:无法从我的 LEMP 堆栈访问 phpMyAdmin
- python - 一个字符串中的多个字符串替换
- python - 如何在 Python 中使用新数据更新绘图?