如何使用emr上的spark在hive metastore中注册s3Parquet文件

lpwwtiir  于 2021-06-28  发布在  Hive
关注(0)|答案(3)|浏览(541)

我正在使用amazon elastic map reduce 4.7.1、hadoop 2.7.2、hive 1.0.0和spark 1.6.1。
用例:我有一个用于处理数据的spark集群。这些数据作为Parquet文件存储在s3中。我希望工具能够使用在配置单元元存储中注册的名称来查询数据(例如,查找 foo 而不是table parquet.s3://bucket/key/prefix/foo/parquet`` 做事的风格)。我还希望这些数据在配置单元元存储(一个单独的rds示例)的生命周期内保持不变,即使我拆掉emr集群并启动一个连接到同一元存储的新集群。
问题:如果我这样做 sqlContext.saveAsTable("foo") 默认情况下,这将在配置单元元存储中创建托管表(请参见https://spark.apache.org/docs/latest/sql-programming-guide.html). 这些托管表将数据从s3复制到emr集群上的hdfs,这意味着拆下emr集群后元数据将毫无用处。

kdfy810k

kdfy810k1#

我解决这个问题的方法是:首先在spark中创建hive表:

schema = StructType([StructField("key", IntegerType(), True),StructField("value", StringType(), True)])
df = spark.catalog \
          .createTable("data1", "s3n://XXXX-Buket/data1",schema=schema)

接下来,在hive中,它将显示上面从spark创建的表(在这种情况下,数据1)
此外,在另一个配置单元引擎中,您可以通过创建与spark:command:

CREATE EXTERNAL TABLE data1 (key INT, value String) STORED AS PARQUET LOCATION 's3n://XXXX-Buket/data1’
tktrz96b

tktrz96b2#

解决方案是将s3文件注册为外部表。 sqlContext.createExternalTable("foo", "s3://bucket/key/prefix/foo/parquet") 我还没有弄清楚如何将文件保存到s3并将其注册为一个外部表,但是 createExternalTable 不会增加太多开销。

dgjrabp2

dgjrabp23#

你不需要电子病历。只要启动雅典娜,创建一个表来读取Parquet格式的数据。这是一个比电子病历便宜得多的选择,也是可持续的。您可以使用jdbc通过雅典娜实时访问这些数据。

相关问题