草庐IT

python - PySpark - Hive 上下文不返回结果但 SQL 上下文返回类似查询

coder 2024-01-08 原文

当我在 PySpark 中运行 HiveContext 和 SQLContext 进行比较查询时,我注意到性能存在巨大差异

版本/配置

  • Spark 1.3.1(也尝试过 Spark 1.5.1)
  • Hadoop 2.6(在 CDH 5.4.0 上)
  • pyspark --master yarn --num-executors 5 --executor-memory 10g --driver-memory 4g --driver-cores 4

表格信息

  • database.table 有超过 2k 个分区
  • database.table 在 field1 上分区(在 where 子句中使用)

HIVE 上下文实现

from pyspark.sql import SQLContext
sqlContext = HiveContext(sc) 
qry = "select count(*) from database.table a where a.field1 = 'ABCD'"
results = sqlContext.sql(qry).collect()
  • 花费的时间不确定——我不得不停止执行查询,因为它很快就占用了我执行查询的边缘节点上超过 50% 的系统资源。

SQL上下文实现

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.parquetFile('hdfs_path_to_hive_table/field1=ABCD/')
df.select("field2").show()
  • 执行时间为 6.5 秒,并按预期返回数据帧。

问题

  • 有没有人注意到类似的事情?
  • 后端发生了什么可能会导致这种资源消耗,我应该如何避免这种情况?

如有任何帮助,我们将不胜感激!

2015 年 10 月 16 日更新

我试过:

SET spark.sql.hive.metastorePartitionPruning=true

我仍然遇到同样的问题。我让进程运行了一段时间,以测试 CPU 使用率会上升到多高,它达到了 2000% 以上!

我听说 Parquet 格式的文件在 1.5 版之前可能是 spark 的一个问题,所以我在 spark 1.5.1 中使用这些附加设置进行的所有测试:

parquet.task.side.metadata=false
SET spark.sql.parquet.filterPushdown=true
SET spark.sql.parquet.cacheMetadata=false

但他们似乎都没有帮助。

在寻求答案的过程中,我遇到了这些不同的链接,这些链接让我尝试了上述配置:

  • Spark 读取 Parquet 的 Metastore(parquet.task.side.metadata=false 和 SET spark.sql.parquet.filterPushdown=true):
    • _https://issues.apache.org/jira/browse/SPARK-5346
    • _http://stackoverflow.com/questions/31226757/partitions-not-being-pruned-in-simple-sparksql-queries
  • Spark 1.5.1 配置链接(SET spark.sql.parquet.cacheMetadata=false):
    • _http://spark.apache.org/docs/latest/sql-programming-guide.html#configuration
  • 链接到与我的非常相似的先前问题:
    • _https://mail-archives.apache.org/mod_mbox/spark-user/201509.mbox/%3CCAAswR-7C0Cfduj+iaVDb-XvrnCHScrh34Lo0BadWH6XPzUXePA@mail.gmail.com%3E

最佳答案

这可能不是 HiveContext/SQLContext 之间的区别,而是元数据来自 HiveMetastore 的表与 SparkSQL 数据源 API 之间的区别。我想如果您以相同的方式创建表,性能会相似。

在数据源 API 中,我们花了相当多的时间来优化许多分区的发现和处理,总的来说,我认为这条路径更容易使用/更快。

hive 表的问题可能是从 Metastore 下载所有分区元数据并将其转换为我们的内部格式。我们对所有分区都这样做,即使在这种情况下您只需要前 ~20 行。

为了提高这种情况下的性能,我会尝试运行:

SET spark.sql.hive.metastorePartitionPruning=true

关于python - PySpark - Hive 上下文不返回结果但 SQL 上下文返回类似查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33134699/

有关python - PySpark - Hive 上下文不返回结果但 SQL 上下文返回类似查询的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  3. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  4. ruby - Ruby 中的隐式返回值是怎么回事? - 2

    所以我开始关注ruby​​,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出

  5. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  6. ruby-on-rails - ruby 日期方程不返回预期的真值 - 2

    为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998

  7. ruby - 从 String#split 返回的零长度字符串 - 2

    在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  10. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

随机推荐