【问题标题】:Pandas dataframe in pyspark to hivepyspark中的熊猫数据框到蜂巢
【发布时间】:2016-08-23 12:31:55
【问题描述】:

如何将 pandas 数据帧发送到 hive 表?

我知道如果我有一个 spark 数据框,我可以使用

将它注册到一个临时表中
df.registerTempTable("table_name")
sqlContext.sql("create table table_name2 as select * from table_name")

但是当我尝试使用 pandas dataFrame 来注册临时表时,我收到以下错误:

AttributeError: 'DataFrame' object has no attribute 'registerTempTable'

有没有办法让我使用 pandas dataFrame 来注册临时表或将其转换为 spark dataFrame,然后使用它注册临时表,以便我可以将其发送回 hive。

【问题讨论】:

  • 必须转换,错误很明显,pandas 数据框的属性不存在
  • 是的,但我不知道如何将 pandas 数据帧转换为 spark 数据帧。我尝试使用sqlContext.createDataFrame(df),但它只需要模式而不是数据帧中的数据。

标签: python-2.7 pandas hive pyspark


【解决方案1】:

首先你需要将 pandas 数据帧转换为 spark 数据帧:

from pyspark.sql import HiveContext
hive_context = HiveContext(sc)
df = hive_context.createDataFrame(pd_df)

然后你可以在内存中创建一个临时表:

df.registerTempTable('tmp')

现在,你可以使用 hive ql 将数据保存到 hive 中:

hive_context.sql("""insert overwrite table target partition(p='p') select a,b from tmp'''

注意:hive_context 必须保持一致!

【讨论】:

    【解决方案2】:

    我将我的 pandas df 转换为一个临时表

    1) 将 pandas 数据帧转换为 spark 数据帧:

    spark_df=sqlContext.createDataFrame(Pandas_df)
    

    2) 确保数据正确迁移

    spark_df.select("*").show()
    

    3) 将 spark 数据帧转换为临时表进行查询。

    spark_df.registerTempTable("table_name").
    

    干杯..

    【讨论】:

      【解决方案3】:

      我猜你正在尝试使用 pandas df 而不是 Spark's DF

      Pandas DataFrame 没有registerTempTable 这样的方法。

      您可以尝试从 pandas DF 创建 Spark DF。

      更新:

      我已经在 Cloudera 下对其进行了测试(安装了 Anaconda parcel,其中包括 Pandas 模块)。

      确保您在所有 Spark 工作人员(通常位于:spark-conf/spark-env.sh)上将 PYSPARK_PYTHON 设置为您的 anaconda python 安装(或另一个包含 Pandas 模块的安装)

      这是我的测试结果:

      >>> import pandas as pd
      >>> import numpy as np
      >>> df = pd.DataFrame(np.random.randint(0,100,size=(10, 3)), columns=list('ABC'))
      >>> sdf = sqlContext.createDataFrame(df)
      >>> sdf.show()
      +---+---+---+
      |  A|  B|  C|
      +---+---+---+
      | 98| 33| 75|
      | 91| 57| 80|
      | 20| 87| 85|
      | 20| 61| 37|
      | 96| 64| 60|
      | 79| 45| 82|
      | 82| 16| 22|
      | 77| 34| 65|
      | 74| 18| 17|
      | 71| 57| 60|
      +---+---+---+
      
      >>> sdf.printSchema()
      root
       |-- A: long (nullable = true)
       |-- B: long (nullable = true)
       |-- C: long (nullable = true)
      

      【讨论】:

      • 有没有办法将pandas转换为spark DF?我可以尝试在 spark df 中编写所有功能,但它不像 pandas 那样灵活。
      • 是的,它只创建模式但不带数据。一旦你尝试让我知道它是如何为你工作的。
      • 或者如果您知道另一种在不使用临时表的情况下将数据发送回 hive 的方法,请分享。只要我将数据恢复到配置单元中,我就不热衷于使用临时表。
      • 你在家试过了吗?
      • 好的,如果您稍后尝试,请告诉我。我仍在努力解决这个问题,如果我无法做到这一点,那么我会尝试使用 Scala 来完成我的工作。
      猜你喜欢
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 2014-02-01
      相关资源
      最近更新 更多