如何在电子病历上使用Spark在Hive Metastore中注册S3 Parquet文件



我使用的是Amazon Elastic Map Reduce 4.7.1、Hadoop 2.7.2、Hive 1.0.0和Spark 1.6.1。

用例:我有一个用于处理数据的Spark集群。该数据作为Parquet文件存储在S3中。我希望工具能够使用在配置单元元存储中注册的名称查询数据(例如,查找foo表,而不是parquet.`s3://bucket/key/prefix/foo/parquet`风格的做事)。我还希望这些数据在配置单元Metastore(一个单独的RDS实例)的生命周期内保持不变,即使我拆除了EMR集群并启动了一个连接到同一Metastore的新集群。

问题:如果我执行类似sqlContext.saveAsTable("foo")的操作,默认情况下会在配置单元元存储中创建一个托管表(请参阅https://spark.apache.org/docs/latest/sql-programming-guide.html)。这些托管表将数据从S3复制到EMR集群上的HDFS,这意味着在拆除EMR集群后,元数据将毫无用处。

解决方案是将S3文件注册为外部表。

sqlContext.createExternalTable("foo", "s3://bucket/key/prefix/foo/parquet")

我还没有弄清楚如何将文件保存到S3并将其注册为外部表,但createExternalTable不会增加太多开销。

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

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

接下来,在Hive中,它将显示由上面的spark创建的表。(在本例中为数据1)

此外,在另一个hive引擎中,您可以通过创建与spark中创建的类型相同的外部表数据来链接到此数据is S3:命令:

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

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

最新更新