Scala 如何使用spark将数据加载到配置单元外部表?

Scala 如何使用spark将数据加载到配置单元外部表?,scala,apache-spark,hive,Scala,Apache Spark,Hive,我想尝试使用spark将数据加载到配置单元外部表中。 请帮助我,如何使用scala代码或java将数据加载到配置单元中 提前感谢假设已经使用以下内容创建了hive外部表: CREATE EXTERNAL TABLE external_parquet(c1 INT, c2 STRING, c3 TIMESTAMP) STORED AS PARQUET LOCATION '/user/etl/destination'; -- location is some directory on

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


提前感谢

假设已经使用以下内容创建了hive外部表:

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)

**我尝试过类似的场景,并获得了令人满意的结果。我使用json中的模式处理avro数据。我使用spark streaming将kafka主题流化,并将数据持久化到hdfs中,hdfs是外部表的位置。因此每2秒(数据流持续时间将存储在单独文件中的hdfs中,并且还将附加配置单元外部表)

下面是简单的代码片段

 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”。优雅地停止“SSC”更可取。

附言:
请注意,在创建外部表时,请确保您创建的表的架构与dataframe架构相同。因为当转换为dataframe时,这些列将按字母顺序排列。

如果我要将此表分区,例如:按“c3”分区,该怎么办?