我想知道大家对于从Hive读取数据和从.csv、.txt、.ORC或.parquet文件中读取数据的看法。假设底层Hive表是一个与文件格式相同的外部表,你更愿意从Hive表中读取数据还是直接从底层文件中读取数据,为什么呢?
Mike
我想知道大家对于从Hive读取数据和从.csv、.txt、.ORC或.parquet文件中读取数据的看法。假设底层Hive表是一个与文件格式相同的外部表,你更愿意从Hive表中读取数据还是直接从底层文件中读取数据,为什么呢?
Mike
简述:我建议直接从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完成的,因此我无法评论两种读取机制之间可能出现的速度提升。
.ORC
更适用于平面结构,而parquet
更适用于嵌套结构,但是spark
针对parquet
进行了优化。因此,建议在使用spark
时使用该格式。parquet
读取的所有表的元数据都将存储在hive
中。这是spark文档中的说明:Spark SQL缓存Parquet元数据以提高性能。启用Hive metastore Parquet表转换时,这些转换表的元数据也被缓存。如果这些表由Hive或其他外部工具更新,则需要手动刷新它们以确保一致的元数据。
我倾向于尽快将数据转换为parquet
格式,并将其存储在alluxio
上,由hdfs
支持。这使我可以实现更好的读/写
操作性能,并限制使用cache
。