【问题标题】:Is it better for Spark to select from hive or select from fileSpark是从hive中选择还是从文件中选择更好
【发布时间】:2017-10-22 13:00:34
【问题描述】:

我只是想知道人们对从 Hive 读取与从 .csv 文件或 .txt 文件或 .ORC 文件或 .parquet 文件读取的想法是什么。假设底层 Hive 表是具有相同文件格式的外部表,您更愿意从 Hive 表中读取还是从底层文件本身读取,为什么?

迈克

【问题讨论】:

  • 您可能会发现stackoverflow.com/questions/32373460/… 的最新答案非常有趣>>矢量化是一个真正的好处......以及基于本地统计数据的“谓词下推”,“跳过扫描”(这两个功能都需要列格式)、高效的分区修剪、适当的压缩......
  • 问得好大迈克

标签: apache-spark hive spark-dataframe parquet flat-file


【解决方案1】:

tl;dr : 我会直接从镶木地板文件中阅读它

我正在使用 Spark 1.5.2 和 Hive 1.2.1 对于 500 万行 X 100 列的表,我记录的一些时间是

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

dffile 计数 --> 0.38s; dfhive 计数 --> 8.99s

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

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

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

请注意,这些是使用旧版本的 Hive 和旧版本的 Spark 完成的,因此我无法评论这两种读取机制之间的速度改进是如何发生的

【讨论】:

    【解决方案2】:

    据我了解,尽管一般.ORC 更适合平面结构,parquet 更适合嵌套结构,spark 已针对parquet 进行了优化。因此,建议使用 spark 的格式。

    此外,从parquet 读取的所有表的Metadata 将存储在hiveanyway 中。这是火花文档:Spark SQL caches Parquet metadata for better performance. When Hive metastore Parquet table conversion is enabled, metadata of those converted tables are also cached. If these tables are updated by Hive or other external tools, you need to refresh them manually to ensure consistent metadata.

    我倾向于尽快将数据转换为parquet 格式并在alluxio 支持下存储它hdfs。这使我能够为read/write 操作获得更好的性能,并限制使用cache

    我希望它有所帮助。

    【讨论】:

    • 你在使用Alluxio真是太棒了!但我的问题具体是关于 Hive 与非 Hive 的。无论是 ORC、Parquet 还是其他东西,都可以用其他东西来定义。可能需要拥有 ORC。我只是在询问 Hive 表而不是文件。
    • 尽管我认为 Spark 在 parquet 方面仍然更好,但必须指出的是,Spark 一直致力于支持自 Spark 2.3 (spark.apache.org/docs/latest/sql-data-sources-orc.html) 以来提供的 ORC 支持。所以这在未来可能会改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    相关资源
    最近更新 更多