【问题标题】:Access Hive Data Using Python使用 Python 访问 Hive 数据
【发布时间】:2020-06-22 09:43:03
【问题描述】:

我在 HDFS 中有一些数据,我需要使用 python 访问这些数据,谁能告诉我如何使用 python 从 hive 访问数据?

【问题讨论】:

    标签: python hive


    【解决方案1】:

    要安装,您需要以下库:

    pip install sasl
    pip install thrift
    pip install thrift-sasl
    pip install PyHive
    

    如果您使用的是 Linux,则可能需要在运行上述程序之前单独安装 SASL。使用apt-getyum 或任何包管理器安装包libsasl2-dev。对于 Windows,有一些选项 on GNU.org。如果您已安装 xcode 开发人员工具 (xcode-select --install),则在 Mac 上应该可以使用 SASL

    安装后,您可以像这样执行 hive 查询:

    from pyhive import hive
    conn = hive.Connection(host="YOUR_HIVE_HOST", port=PORT, username="YOU")
    

    现在您已经有了 hive 连接,您可以选择如何使用它。您可以直接查询:

    cursor = conn.cursor()
    cursor.execute("SELECT cool_stuff FROM hive_table")
    for result in cursor.fetchall():
      use_result(result)
    

    ...或使用连接来制作 Pandas 数据框:

    import pandas as pd
    df = pd.read_sql("SELECT cool_stuff FROM hive_table", conn)
    

    【讨论】:

    • "Could not start SASL: %s" % self.sasl.getError()" - windows 2008 R2, python 3.6下。如何解决这个问题?
    • 这是节俭问题,我也遇到了同样的问题,在 Linux 环境下,它工作正常。
    • 确认 windows 问题并且它确实在 Linux 上工作。我使用 Windows 10 进行开发(PyCharm)。我不能在那里“pip install pyhive [hive]”;依赖项失败。但是如果你只是“pip install pyhive”(或者其他什么,使用 PyCharm 的包管理器),那么你可以针对它进行开发。当我导入 PyHive 时,我将它包装在 if os.name != "nt": 语句中,因此它在 Windows 上被跳过。不过,一切都可以在 Linux 上安装并运行良好(Centos 7)。
    【解决方案2】:

    您可以使用 hive 库从 python 访问 hive,因为您要导入 hive 类 从蜂巢导入 ThriftHive

    下面的例子

    import sys
    
    from hive import ThriftHive
    from hive.ttypes import HiveServerException
    
    from thrift import Thrift
    from thrift.transport import TSocket
    from thrift.transport import TTransport
    from thrift.protocol import TBinaryProtocol
    
    try:
      transport = TSocket.TSocket('localhost', 10000)
      transport = TTransport.TBufferedTransport(transport)
      protocol = TBinaryProtocol.TBinaryProtocol(transport)
      client = ThriftHive.Client(protocol)
      transport.open()
      client.execute("CREATE TABLE r(a STRING, b INT, c DOUBLE)")
      client.execute("LOAD TABLE LOCAL INPATH '/path' INTO TABLE r")
      client.execute("SELECT * FROM r")
      while (1):
        row = client.fetchOne()
        if (row == None):
           break
        print row
    
      client.execute("SELECT * FROM r")
      print client.fetchAll()
      transport.close()
    except Thrift.TException, tx:
      print '%s' % (tx.message)
    

    【讨论】:

    • 请告诉我如何获取 hive 库?
    • 您可以从 $HIVE_HOME/lib/py/* 获取该库,将 py 文件夹中的内容复制到 python 库中
    • @Sreejith 我导入这些 python 库没有问题,但是,执行 hive 命令后代码挂起。结果证明这是一个普遍的问题。您的代码是连接到 Hiveserver1 还是 Hiveserver2? groups.google.com/a/cloudera.org/forum/#!topic/cdh-user/…
    【解决方案3】:

    如果您在 Windows 上使用pyodbc,则更简单的解决方案:

      import pyodbc
      import pandas as pd
    
      # connect odbc to data source name
      conn = pyodbc.connect("DSN=<your_dsn>", autocommit=True)
    
      # read data into dataframe
      hive_df = pd.read_sql("SELECT * FROM <table_name>", conn)
    

    只要您有 ODBC 驱动程序和 DSN,这就是您所需要的。

    【讨论】:

    • 在 Linux 上没那么简单:-/
    • @SamsonScharfrichter 好点 - 我将添加一条说明,说明我的解决方案适用于 Windows。
    • 这在 Linux 上是 doable 的,只是不简单(检查安装的 unixODBC 版本是否足够新,检查您的 $LD_LIBRARY_PATH 是否使用它的库,安装适当的ODBC驱动,在odbcinst.ini中引用该驱动,在odbc.ini中定义DSN,排除故障)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2014-02-03
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    相关资源
    最近更新 更多