apache-spark - EMR 和外部 hive/glue 上的 Pyspark - 可以通过 sqlContext 删除但不能创建表
问题描述
我正在从在 EMR 上运行的 pyspark 将数据帧写入外部配置单元表。这项工作涉及从外部 hive 表中删除/截断数据,将数据帧的内容写入上述表,然后将数据从 hive 写入 DynamoDB。我希望写入 EMR 集群上的内部表,但现在我希望配置单元数据可用于后续集群。我可以直接写入 Glue 目录并强制它注册,但这比我需要走的更远。
所有组件在给定的 EMR 集群上单独运行良好:我可以使用脚本或 ssh 和 hive shell 在 EMR 上创建外部 hive 表。这个表可以被 Athena 查询,也可以被 pyspark 读取。我可以创建一个数据框并将数据插入到上述 pyspark 表中。然后,我可以使用 hive shell 将数据从 hive 表复制到 DynamoDB 表中。
我想将所有工作打包到一个 pyspark 脚本中,而不必提交多个不同的步骤。我可以使用删除表
sqlContext.sql("drop table if exists default.my_table")
当我尝试使用创建表时sqlContext.sql("create table default.mytable(id string,val string) STORED AS ORC")
,出现以下错误:
org.apache.hadoop.net.ConnectTimeoutException:调用从 ip-xx-xxx-xx-xxx/xx.xxx.xx.xx 到 ip-xxx-xx-xx-xx:8020 套接字超时异常失败:org.apache .hadoop.net.ConnectTimeoutException:等待通道准备好连接时超时 20000 毫秒。ch : java.nio.channels.SocketChannel[connection-pending remote=ip-xxx-xx-xx-xx:8020]; 有关更多详细信息,请参阅: http ://wiki.apache.org/hadoop/SocketTimeout
我不知道为什么我可以在集群上使用 hive shell 在 Glue 中创建外部 hive 表,使用 hive shell 或 pyspark sqlcontext 删除表,但我无法使用 sqlcontext 创建表。我已经检查过了,提供的解决方案在这种情况下没有意义(复制 hive-site.xml),因为我可以毫不费力地清楚地写入所需的地址,而不是在 pyspark 中。更奇怪的是,当我登记入住 Athena 时,我可以丢弃这些桌子,而它们肯定会被丢弃。
运行于:emr-5.28.0,Hadoop 发行版 Amazon 2.8.5 Spark 2.4.4 Hive 2.3.6 Livy 0.6.0(用于笔记本,但我的实验是通过 ssh 和 pyspark shell)
解决方案
事实证明,只要我提供了表的位置,我就可以通过 spark.sql() 调用创建表。似乎 Hive shell 不需要它,但 spark.sql() 需要它。不出所料,但也不完全出人意料。
推荐阅读
- c++ - 使用友元函数重载的 C++ 运算符。尝试添加多个对象失败
- javascript - 使用 lodash 对对象进行分组
- xamarin.forms - Microsoft Azure 存储数据移动库以及 xamarin 表单
- ios - 回到 UIViewController 不会触发 segue
- c# - 我可以帮助 C# 编译器推断这种类型吗?
- c - 如何在 CLion 中设置断点条件
- javascript - 更改 js 函数参数的引用
- sql - 如何不重复使用 SQL where 子句
- android - 如何将图像添加到 ProgressDialog?
- javascript - 使用 Puppeteer 将结果抓取到 JSON 时无限重启