我正在使用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集群后元数据将毫无用处。
3条答案
按热度按时间kdfy810k1#
我解决这个问题的方法是:首先在spark中创建hive表:
接下来,在hive中,它将显示上面从spark创建的表(在这种情况下,数据1)
此外,在另一个配置单元引擎中,您可以通过创建与spark:command:
tktrz96b2#
解决方案是将s3文件注册为外部表。
sqlContext.createExternalTable("foo", "s3://bucket/key/prefix/foo/parquet")
我还没有弄清楚如何将文件保存到s3并将其注册为一个外部表,但是createExternalTable
不会增加太多开销。dgjrabp23#
你不需要电子病历。只要启动雅典娜,创建一个表来读取Parquet格式的数据。这是一个比电子病历便宜得多的选择,也是可持续的。您可以使用jdbc通过雅典娜实时访问这些数据。