【问题标题】:how to create dataframe from hive external table如何从配置单元外部表创建数据框
【发布时间】:2017-10-10 09:15:09
【问题描述】:

我们喜欢在 Hive 外部表之上创建数据框,并使用 hive 架构和数据进行 spark 级别的计算。

我们能否从 hive 外部表中获取架构并将其用作 Dataframe 架构。

【问题讨论】:

  • 我不完全确定,但我认为你拥有什么样的 Hive 表对 Spark 没有任何影响。至于架构,您能否提供有关您在 Hive 表中使用的数据格式的更多详细信息?
  • 我们有没有标头的 csv 数据文件,目前在这些文件上创建了外部文件,所以我们喜欢使用 hive 外部表模式来创建数据帧。
  • 您考虑过接受答案吗?
  • 你有没有想过接受答案?

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


【解决方案1】:

您可以使用自己的列名创建数据框到toDF()

df = spark.sql("select * from table").toDF(col1,col2)

【讨论】:

    【解决方案2】:

    加载数据框中的数据

    df=sqlContext.sql("select * from hive_table")
    

    使用 structTypes 获取架构

    df.schema
    

    获取 Hive 表的列名称

    df.columns
    

    获取具有数据类型的列名

    df.dtypes
    

    【讨论】:

      【解决方案3】:

      要从 Spark 访问 Hive 表,请使用 Spark HiveContext

      import org.apache.spark.sql.hive.HiveContext;
      
      val sc = new SparkContext(conf)
      val sqlContext = new HiveContext(sc)
      .
      .
      do other stuff..then
      .
      .
      
      val data = sqlContext.sql("select * from hive_table");
      

      data 将是您的数据框,其中包含 Hive 表的架构。

      【讨论】:

        【解决方案4】:

        hive-metastore 知道您的表的架构并将此信息传递给 spark。表是否外部无关紧要:

        val df = sqlContext.table(tablename)
        

        其中sqlContext 的类型为HiveContext。您可以使用

        验证您的架构
        df.printSchema
        

        【讨论】:

        • 同样的方法也适用于 SparkSession(我怀疑在创建 SparkSession 时必须使用 enableHiveSupport())。
        【解决方案5】:

        启用 Hive 的 Spark 可以开箱即用地执行此操作。请参考docs.

        val dataframe = spark.sql("SELECT * FROM table")
        val schema = dataframe.schema
        

        【讨论】:

        • Raphael Roth 通过sqlContext.table(tablename) 提供更清洁的解决方案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 2016-09-29
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        • 2015-01-01
        • 2020-08-14
        相关资源
        最近更新 更多