【问题标题】:How do I flatMap a row of arrays into multiple rows in Apache spark using Java?如何使用 Java 将一行数组平面映射到 Apache Spark 中的多行?
【发布时间】:2016-04-09 03:19:30
【问题描述】:

我有一个 json 数据文件,其中包含一个属性,即“标签”的字符串数组。 Apache Spark DataFrame 架构如下所示:

root
 |-- acceptedAnswerId: long (nullable = true)
 |-- answerCount: long (nullable = true)
 |-- body: string (nullable = true)
 |-- score: long (nullable = true)
 |-- <b>tags</b>: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- title: string (nullable = true)
 |-- viewCount: long (nullable = true)

我想在 Java 中将每一行分解成几行。我可以使用Scala 找到类似的答案,但无法在 Java 中转换解决方案。有什么建议吗?

JSON 中的“标签”属性如下所示:

"tags":["c#",".net","compression","decompression"]

【问题讨论】:

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


    【解决方案1】:

    为了让解决方案更直观,示例 json 数据如下所示:

    {"id":4,"score":358,"viewCount":24247,"answerCount":13,"commentCount":1,"favoriteCount":28,"tags":["c#","winforms", "类型转换","不透明度"]}

    下面是 Java 代码 sn-p 将 json 数据读取为“DataFrame”对象:

    JavaSparkContext sc = new JavaSparkContext(conf); SQLContext sqlContext = new SQLContext(sc); String jsonData = "{\"id\":4,\"score\":358,\"viewCount\":24247,\"tags\":[\"c#\",\"winforms\",\"类型转换\",\"不透明度\"]}"; 列表数据集 = Arrays.asList(jsonData); JavaRDD distData = sc.parallelize(dataSet); DataFrame stackoverflow_Posts = sqlContext.read().json(distData); stackoverflow_Posts.printSchema(); //让我们打印出 DataFrame 模式(输出#1) stackoverflow_Posts.show(); //让我们显示DataFrame内容(输出#2)

    架构:输出#1 如下所示:

    根 |-- id: long (可为空 = true) |-- 得分:长(可为空=真) |-- 标签:数组(可为空=真) | |-- 元素:字符串(包含Null = true) |-- viewCount: long (nullable = true)

    数据:输出#2如下所示:

    +----+-----+--------+---------+ | id|分数|标签|查看次数| +----+-----+--------+---------+ | 4| 358|[c#,winforms,ty...| 24247| +----+-----+--------+---------+

    根据zero323的信息,我继续处理:

    DataFrame 扩展 = stackoverflow_Posts.withColumn("tag", org.apache.spark.sql.functions.explode(stackoverflow_Posts.col("tags"))); 扩展的.printSchema(); //让我们再次打印出 DataFrame 模式(输出#3) 展开.show(); //让我们显示DataFrame内容(输出#4)

    架构:输出#3如下所示:

    根 |-- id: long (可为空 = true) |-- 得分:长(可为空=真) |-- 标签:数组(可为空=真) | |-- 元素:字符串(包含Null = true) |-- viewCount: long (nullable = true) |-- 标签:字符串(可为空=真)

    explode之后的数据:Output#4

    +----+-----+--------+---------+-------- --------+ | id|分数|标签|查看次数|标签| +----+-----+--------+---------+-------- --------+ | 4| 358|[c#,winforms,ty...| 24247| c#| | 4| 358|[c#,winforms,ty...| 24247|表格| | 4| 358|[c#,winforms,ty...| 24247|类型转换| | 4| 358|[c#,winforms,ty...| 24247|不透明度| +----+-----+--------+---------+-------- --------+

    结果看起来非常相似,就像使用 SQL 连接两个表。

    【讨论】:

      【解决方案2】:

      您可以简单地使用explode 函数。

      DataFrame df = ...
      DataFrame expanded = df.withColumn(
        "tag", org.apache.spark.sql.functions.explode(df.col("tags"))).drop("tags");
      

      【讨论】:

        猜你喜欢
        • 2015-08-30
        • 1970-01-01
        • 2016-11-15
        • 2017-04-09
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 2020-06-13
        • 1970-01-01
        相关资源
        最近更新 更多