如何使用spark将数据加载到hive外部表?

时间:2016-05-25 10:10:39

标签: scala apache-spark hive

我想尝试使用spark将数据加载到hive外部表中。 请帮助我,如何使用scala代码或java

将数据加载到配置单元

提前致谢

2 个答案:

答案 0 :(得分:1)

假设已经使用类似

之类的东西创建了配置单元外部表
CREATE EXTERNAL TABLE external_parquet(c1 INT, c2 STRING, c3 TIMESTAMP) 
    STORED AS PARQUET LOCATION '/user/etl/destination';   -- location is some directory on HDFS

你在Spark中有一个现有的dataFrame / RDD,你想写。

import sqlContext.implicits._
val rdd = sc.parallelize(List((1, "a", new Date), (2, "b", new Date), (3, "c", new Date)))
val df = rdd.toDF("c1", "c2", "c3")  //column names for your data frame
df.write.mode(SaveMode.Overwrite).parquet("/user/etl/destination") // If you want to overwrite existing dataset (full reimport from some source)

如果您不想覆盖数据集中的现有数据......

df.write.mode(SaveMode.Append).parquet("/user/etl/destination")  // If you want to append to existing dataset (incremental imports)

答案 1 :(得分:1)

**我尝试了类似的场景,并且得到了满意的结果。我在json中使用了avro数据和模式。我使用spark流式传输kafka主题,并将数据保存到hdfs,这是外部表的位置。所以每2秒(数据将在单独的文件中存储到hdfs的流式传输持续时间,并且还将附加hive外部表)。

以下是简单的代码段

 val messages = KafkaUtils.createStream[String, String, StringDecoder, StringDecoder](ssc, kafkaConf, topicMaps, StorageLevel.MEMORY_ONLY_SER)
    messages.foreachRDD(rdd =>
      {
        val sqlContext = new org.apache.spark.sql.SQLContext(sc)
        import sqlContext.implicits._

        val dataframe = sqlContext.read.json(rdd.map(_._2))
        val myEvent = dataframe.toDF()
        import org.apache.spark.sql.SaveMode


        myEvent.write.format("parquet").mode(org.apache.spark.sql.SaveMode.Append).save("maprfs:///location/of/hive/external/table")
      })

请勿忘记在应用程序结束时停止“ SSC ”。更优先选择优先。

P.S: 请注意,在创建外部表时,请确保使用与数据帧架构相同的架构创建表。因为当转换为只是表格的数据框时,列将按字母顺序排列。