使用来自json数组的java spark sql将表保存在hive中

Posted

技术标签:

【中文标题】使用来自json数组的java spark sql将表保存在hive中【英文标题】:Save table in hive with java spark sql from json array 【发布时间】:2018-09-19 21:49:56 【问题描述】:
    Dataset<Row> ds = spark.read().option("multiLine", true).option("mode", "PERMISSIVE").json("/user/administrador/prueba_diario.txt").toDF();

    ds.printSchema();

    Dataset<Row> ds2 = ds.select("articles").toDF();

    ds2.printSchema();
    spark.sql("drop table if exists table1"); 
    ds2.write().saveAsTable("table1");

我有这个json格式

root
 |-- articles: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- author: string (nullable = true)
 |    |    |-- content: string (nullable = true)
 |    |    |-- description: string (nullable = true)
 |    |    |-- publishedAt: string (nullable = true)
 |    |    |-- source: struct (nullable = true)
 |    |    |    |-- id: string (nullable = true)
 |    |    |    |-- name: string (nullable = true)
 |    |    |-- title: string (nullable = true)
 |    |    |-- url: string (nullable = true)
 |    |    |-- urlToImage: string (nullable = true)
 |-- status: string (nullable = true)
 |-- totalResults: long (nullable = true)

我想将数组文章保存为具有数组格式的配置单元表

我想要的配置单元表示例:

author (string)
content (string)
description (string)
publishedat (string)
source (struct<id:string,name:string>)
title (string)
url (string)
urltoimage (string)

问题是只用一列名为 article 保存表,而竞争就在这一列中

【问题讨论】:

【参考方案1】:

有点复杂,但我发现这个可以工作:

import org.apache.spark.sql.functions._
ds.select(explode(col("articles")).as("exploded")).select("exploded.*").toDF()

我测试过


  "articles": [
    
      "author": "J.K. Rowling",
      "title": "Harry Potter and the goblet of fire"
    ,
    
      "author": "George Orwell",
      "title": "1984"
    
  ]

它返回了(在将它收集到一个数组之后)

result = Arrays$ArrayList@13423  size = 2
 0 = GenericRowWithSchema@13425 "[J.K. Rowling,Harry Potter and the goblet of fire]"
 1 = GenericRowWithSchema@13426 "[George Orwell,1984]"

【讨论】:

我做到了,我在线程“main”org.apache.spark.sql.AnalysisException 中遇到了这个错误异常:只能星号扩展结构数据类型。属性:ArrayBuffer(articles);在 org.apache.spark.sql.catalyst.analysis.UnresolvedStar.expand(unresolved.scala:27​​5) 对不起,我看错了你的架构,它是一个数组而不是一个结构。我会自己尝试一下。 @Bar 已修复,现在应该做你想做的事 是的,但是它将数据保存在单个列中。它应该在 hive 中生成列,因为结构中有列。 非常感谢您的帮助,您给了我一个很好的解决方案!

以上是关于使用来自json数组的java spark sql将表保存在hive中的主要内容,如果未能解决你的问题,请参考以下文章

Tableau + Spark SQL 连接器 + Java Spark 数据帧

读取带有模式的 JSON 数组字符串返回 null spark 2.2.0

Spark SQL大数据处理并写入Elasticsearch

在 JAVA 中使用 Spark 2.1.1 读取嵌套 Json(Spark 2.2 有解决方案,但我正在研究 spark 2.1.1 版本)

使用 Spark 使用包含结构的结构的数组进行 Json 解析

按 JSON 数组对 SQL 数据进行分组