emr和外部hive/glue上的pyspark-可以删除表,但不能通过sqlcontext创建表

1zmg4dgp  于 2021-05-19  发布在  Spark
关注(0)|答案(1)|浏览(433)

我正在从运行在emr上的pyspark向外部配置单元表写入Dataframe。这项工作包括从外部配置单元表中删除/截断数据,将Dataframe的内容写入上述表,然后将数据从配置单元写入dynamodb。我希望写入emr集群上的内部表,但目前我希望配置单元数据可供后续集群使用。我可以直接写到胶水目录,并强制它注册,但这是一个更进一步,我需要去。
在给定的emr集群上,所有组件都可以单独工作:我可以使用脚本或ssh和hiveshell在emr上创建一个外部配置单元表。雅典娜可以查询这个表,pyspark也可以读取这个表。我可以在pyspark中创建一个dataframe并将覆盖数据插入到前面提到的表中。然后我可以使用hiveshell将数据从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 xx/xx..xx.xx到ip xx xx的调用:8020套接字超时失败异常:org.apache.hadoop.net.connecttimeoutexception:等待通道准备好连接时超时20000毫秒。ch:java.nio.channels.socketchannel[connection pending remote=ip xx:8020];有关详细信息,请参阅:http://wiki.apache.org/hadoop/sockettimeout
我不明白为什么我可以在集群上使用hiveshell在glue中创建外部配置单元表,使用hiveshell或pysparksqlcontext删除表,但是我不能使用sqlcontext创建表。我已经检查过了,提供的解决方案在这个上下文(复制hive site.xml)中没有意义,因为我可以毫不费力地清楚地写入所需的地址,只是在pyspark中没有。更奇怪的是,当我在雅典娜登记的时候,我居然能把table扔了,而且table肯定也被扔了。
运行于:emr-5.28.0、hadoop发行版amazon 2.8.5 spark 2.4.4 hive 2.3.6 livy 0.6.0(用于笔记本电脑,但我的实验是通过ssh和pyspark shell进行的)

zysjyyx4

zysjyyx41#

原来我可以通过spark.sql()调用创建表,只要我为表提供了一个位置。似乎hiveshell不需要它,但是spark.sql()需要它。并非意料之中,但也并非完全不令人惊讶。

相关问题