【问题标题】:pyspark, how to read Hive tables with SQLContext?pyspark,如何使用 SQLContext 读取 Hive 表?
【发布时间】:2017-06-09 19:32:56
【问题描述】:

我是 Hadoop 生态系统的新手,但我仍然对一些事情感到困惑。我正在使用 Spark 1.6.0(Hive 1.1.0-cdh5.8.0,Hadoop 2.6.0-cdh5.8.0)

我有一些 Hive 表存在,我可以使用 HUE Web 界面和 Hive(map reduce)和 Impala (mpp) 执行一些 SQL 查询。

我现在正在使用 pySpark(我认为这背后是 pyspark-shell),我想了解和测试 HiveContext 和 SQLContext。有很多线程讨论了两者之间的差异以及各种版本的 Spark。

使用 Hive 上下文,我可以毫无问题地查询 Hive 表:

from pyspark.sql import HiveContext
mysqlContext = HiveContext(sc) 
FromHive = mysqlContext.sql("select * from table.mytable")
FromHive.count()
320

到目前为止一切顺利。由于 SQLContext 是 HiveContext 的子集,我认为基本的 SQL 选择应该可以工作:

from pyspark.sql import SQLContext
sqlSparkContext = SQLContext(sc) 
FromSQL = mysqlContext.sql("select * from table.mytable")
FromSQL.count()

Py4JJavaError: An error occurred while calling o81.sql.
: org.apache.spark.sql.AnalysisException: Table not found: `table`.`mytable`;

我将 hive-site.xml 添加到 pyspark-shell。运行时

sc._conf.getAll(

我明白了:

('spark.yarn.dist.files', '/etc/hive/conf/hive-site.xml'),

我的问题是:

  • 我能否使用 SQLContext 访问 Hive 表以进行简单查询(我知道 HiveContext 更强大,但对我来说这只是为了理解 东西)
  • 如果这是可能的,缺少什么?我找不到任何信息 从我尝试过但似乎不起作用的 hive-site.xml 中

非常感谢

干杯

法比恩

【问题讨论】:

  • HiveContext 是 Spark SQL 执行引擎的一个实例,而不是相反
  • 和 SQLContext 一样,不是吗? link
  • 我的意思是说这个hivecontext是sqlcontext的扩展。给出的答案是正确的。

标签: apache-spark hive apache-spark-sql


【解决方案1】:

正如其他答案中提到的,您不能使用 SQLContext 访问 Hive 表,他们在 Spark 1.x.x 中给出了单独的 HiveContext,这基本上是 SQLContext 的扩展。

原因::

Hive 使用外部元存储来保存所有元数据,例如有关数据库和表的信息。此元存储可以配置为保存在 MySQL 等中。默认为 derby。 这样做是为了让所有访问 Hive 的用户都可以看到 Metastore 提供的所有内容。 Derby 在执行 spark 应用程序的目录中创建一个私有元存储作为目录metastore_db。由于此元存储是私有的,因此您在此会话中创建或编辑的任何内容都不会被其他任何人访问。 SQLContext 基本上有助于连接到私有元存储。

不用说,在 Spark 2.x.x 中,他们将两者合并到 SparkSession 中,作为 spark 的单一入口点。您可以通过.enableHiveSupport().enableHiveSupport()在创建 SparkSession 时启用 Hive 支持

【讨论】:

    【解决方案2】:

    您不能使用标准 SQLContext 直接访问 Hive。要使用 Hive,您需要使用 Hive 支持和 HiveContext 构建的 Spark 二进制文件。

    您可以使用 JDBC 数据源,但对于大规模处理而言,它的性能不可接受。

    【讨论】:

      【解决方案3】:

      要访问 SQLContext 表,您需要临时注册它。然后,您可以轻松地对其进行 SQL 查询。假设您有一些 JSON 格式的数据。您可以在数据框中制作它。

      如下:

      from pyspark.sql import SQLContext
      sqlSparkContext = SQLContext(sc)
      df = sqlSparkContext.read.json("your json data")
      sql_df = df.registerTempTable("mytable")
      FromSQL = sqlSparkContext.sql("select * from mytable")
      FromSQL.show()
      

      你也可以收集下面的行类型数组中的 SQL 数据:-

      r = FromSSQL.collect()
      print r.column_Name
      

      【讨论】:

        【解决方案4】:

        尝试不将 sc 保存到 sqlContext 中,我认为当我们使用 sc 创建 sqlContext 对象时,spark 试图调用 HiveContext 但我们使用的是 sqlContext

        >>>df=sqlContext.sql("select * from <db-name>.<table-name>")

        使用 SQL 上下文的超集,即 HiveContext 来连接并加载配置单元表以触发数据帧

        >>>df=HiveContext(sc).sql("select * from <db-name>.<table-name>")

        (或)

        >>>df=HiveContext(sc).table("default.text_Table") (或)

        >>> hc=HiveContext(sc)

        >>> df=hc.sql("select * from default.text_Table")

        【讨论】:

          猜你喜欢
          • 2021-10-23
          • 1970-01-01
          • 2019-07-27
          • 2018-05-15
          • 1970-01-01
          • 2019-04-21
          • 2019-12-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多