首页 文章

pyspark,如何用SQLContext读取Hive表?

提问于
浏览
1

我是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更强大,但对我来说这只是为了理解事情)

  • 如果有可能缺少什么?我似乎无法工作

非常感谢

干杯

法比恩

4 回答

  • 0

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

    Reason::

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

    毋庸置疑,在Spark 2.x.x中,他们将两者合并为 SparkSession ,它充当了火花的单一切入点 . 您可以通过 .enableHiveSupport() 创建SparkSession时启用Hive支持

  • 2

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

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

  • 1

    要访问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
    
  • 0

    尝试不将sc保留到sqlContext中,我认为当我们使用sc spark创建sqlContext对象时试图调用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")

相关问题