【问题标题】:Cannot load spark json dataframe into a hive table无法将 spark json 数据帧加载到配置单元表中
【发布时间】:2018-07-27 17:29:20
【问题描述】:

我想将一个数据框转换成一个 json 对象并将其加载到一个 json 表中。

下面是代码

创建表格

spark.sql("""create table IF NOT EXISTS user_tech.tests (
Z struct<A:string, 
 B:string,
 C:string>
)
stored as orc """)

import org.apache.spark.sql._

初始数据帧

val df = Seq((1,2,3),(2,3,4)).toDF("A", "B", "C")    


val jsonColumns = df.select("A", "B", "C")

转成json

import org.apache.spark.sql.functions._
val finalDF = jsonColumns.select(to_json(struct(col("A"), col("B"), col("C")))).as("Z")

将行插入表中

finalDF.registerTempTable("test")

spark.sql(""" select * from test """).show()

spark.sql("""Insert into  user_tech.tests select * from test""")

我收到以下错误:

org.apache.spark.sql.AnalysisException: cannot resolve 'test.`structstojson(named_struct(NamePlaceholder(), A, NamePlaceholder(), B, NamePlaceholder(), C))`' due to data type mismatch: cannot cast StringType to StructType(StructField(guid,StringType,true), StructField(sessionid,StringType,true));;

【问题讨论】:

    标签: scala apache-spark apache-spark-sql spark-dataframe


    【解决方案1】:

    问题在于以下语句。

    val finalDF = jsonColumns.select(to_json(struct(col("A"), col("B"), col("C")))).as("Z")
    

    快速验证上述 DataFrame 将使您了解您正在创建单个字符串类型的列。

    scala> finalDF.show
    +--------------------------------------------------------------------------------------------+
    |structtojson(named_struct(NamePlaceholder(), A, NamePlaceholder(), B, NamePlaceholder(), C))|
    +--------------------------------------------------------------------------------------------+
    |                                                                         {"A":1,"B":2,"C":3}|
    |                                                                         {"A":2,"B":3,"C":4}|
    +--------------------------------------------------------------------------------------------+
    
    
    scala> finalDF.printSchema
    root
     |-- structtojson(named_struct(NamePlaceholder(), A, NamePlaceholder(), B, NamePlaceholder(), C)): string (nullable = true)
    

    当您尝试从在 finalDF 上注册的 Temp 表中插入时,架构不匹配并且您遇到了异常。

    以下内容应该适合您。

    spark.sql("""create table IF NOT EXISTS tests (
    Z struct<A:string, 
     B:string,
     C:string>
    )
    stored as orc """)
    
    
    import org.apache.spark.sql._
    
    val df = Seq((1,2,3),(2,3,4)).toDF("A", "B", "C")    
    
    val jsonColumns = df.select("A", "B", "C")
    
    jsonColumns.registerTempTable("tmp")
    
    spark.sql("""Insert into tests select struct(*) from tmp""")
    

    您可以使用以下语句查看数据。

    spark.sql("select * from tests").show
    
    
    +-------+
    |      Z|
    +-------+
    |[1,2,3]|
    |[1,2,3]|
    |[2,3,4]|
    |[2,3,4]|
    +-------+
    

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      相关资源
      最近更新 更多