Spark从Hive中选择还是从文件中选择,哪个更好?

10

我想知道大家对于从Hive读取数据和从.csv、.txt、.ORC或.parquet文件中读取数据的看法。假设底层Hive表是一个与文件格式相同的外部表,你更愿意从Hive表中读取数据还是直接从底层文件中读取数据,为什么呢?

Mike


你可能会对最新答案 https://dev59.com/ulwY5IYBdhLWcg3wpJL_ 感到非常感兴趣>>矢量化是一个真正的奖励...以及“谓词下推”、“skip scans”基于本地统计数据(这两个特性都需要列式格式),高效的分区修剪、适当的压缩... - Samson Scharfrichter
好问题,Big Mike。 - thebluephantom
2个回答

9

简述:我建议直接从parquet文件中读取。

我正在使用Spark 1.5.2和Hive 1.2.1。 对于一个500万行X100列的表格,我记录了一些时间:

val dffile = sqlContext.read.parquet("/path/to/parquets/*.parquet")
val dfhive = sqlContext.table("db.table")

dffile count --> 0.38秒;dfhive count --> 8.99秒

dffile sum(col) --> 0.98秒;dfhive sum(col) --> 8.10秒

dffile substring(col) --> 2.63秒;dfhive substring(col) --> 7.77秒

dffile where(col=value) --> 82.59秒;dfhive where(col=value) --> 157.64秒

请注意,这些是使用较旧版本的Hive和Spark完成的,因此我无法评论两种读取机制之间可能出现的速度提升。


1
据我所知,尽管通常来说.ORC更适用于平面结构,而parquet更适用于嵌套结构,但是spark针对parquet进行了优化。因此,建议在使用spark时使用该格式。
此外,从parquet读取的所有表的元数据都将存储在hive中。这是spark文档中的说明:Spark SQL缓存Parquet元数据以提高性能。启用Hive metastore Parquet表转换时,这些转换表的元数据也被缓存。如果这些表由Hive或其他外部工具更新,则需要手动刷新它们以确保一致的元数据。 我倾向于尽快将数据转换为parquet格式,并将其存储在alluxio上,由hdfs支持。这使我可以实现更好的读/写操作性能,并限制使用cache
希望对您有所帮助。

很棒,你正在使用Alluxio!但是我的问题特别关于Hive和非Hive。无论是ORC、Parquet还是其他什么,这可能由其他因素定义。有可能需要ORC才能满足要求。我只是想问关于Hive表与文件本身的区别。 - uh_big_mike_boi
尽管我认为Spark与Parquet仍然更好,但必须提到的是,Spark不断地致力于其ORC支持,自Spark 2.3以来就可用(https://spark.apache.org/docs/latest/sql-data-sources-orc.html)。因此,这可能会在未来发生变化。 - Markus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接