json - 在 Spark SQL 中使用 JSON 路径

标签 json apache-spark apache-spark-sql jsonpath

在 Spark SQL 中使用嵌套 JSON 时,是否可以使用 JSON 路径从 JSON 中提取数据?

例如:

{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}

要使用 json 路径选择书籍类别引用的作者,我可以使用 $.store.book[?(@.category == 'reference')].author

是否可以使用此类操作定义 Spark 表?

最佳答案

我不知道使用 JSONPath 来做你想做的事情的方法,但我会这样做:

  1. 分解数组,
  2. 查询记录。

请注意,您不必分解整个数组。

代码:

package net.jgp.books.sparkInAction.ch12.lab920QueryOnJson;

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.functions;

/**
 * Using JSONpath-like in SQL queries.
 * 
 * @author jgp
 */
public class QueryOnJsonApp {

  /**
   * main() is your entry point to the application.
   * 
   * @param args
   */
  public static void main(String[] args) {
    QueryOnJsonApp app = new QueryOnJsonApp();
    app.start();
  }

  /**
   * The processing code.
   */
  private void start() {
    // Creates a session on a local master
    SparkSession spark = SparkSession.builder()
        .appName("Query on a JSON doc")
        .master("local")
        .getOrCreate();

    // Reads a JSON, stores it in a dataframe
    Dataset<Row> df = spark.read()
        .format("json")
        .option("multiline", true)
        .load("data/json/store.json");

    // Explode the array
    df = df
        .withColumn("items", functions.explode(df.col("store.book")));

    // Creates a view so I can use SQL
    df.createOrReplaceTempView("books");
    Dataset<Row> authorsOfReferenceBookDf =
        spark.sql("SELECT items.author FROM books WHERE items.category = 'reference'");
    authorsOfReferenceBookDf.show(false);
  }
}

我认为这是一个很好的问题,我将其添加到 Spark in Action 的第 12 章中.

关于json - 在 Spark SQL 中使用 JSON 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48973729/

相关文章:

sql - 使用 scala 在 spark sql 中编写 UDF

mysql - Spark 结构化流 : primary key in JDBC sink

java - Spring Boot 不接受括号内的列表参数

json - 将 tzdata 转换为其他格式?

apache-spark - 重命名写入的 CSV 文件 Spark

scala - 使用保存的 Spark 模型评估新数据

apache-spark - 关于 Spark SQL 中 Dataset.filter 的错误

python - 将日期时间对象与 8601 字符串进行比较会给出错误的结果,为什么允许这样做?

javascript - Fetch -API 返回 HTML 而不是 JSON

javascript - JS/Node : Updating a JSON file with the square brackets