火花红移。将数组展平为字符串

Posted

技术标签:

【中文标题】火花红移。将数组展平为字符串【英文标题】:Spark to redshift. Flatten array to string 【发布时间】:2016-07-13 15:11:24 【问题描述】:

我正在尝试使用 spark-redshift 连接器将嵌套的 JSON 保存到 redshift

问题是 redshift 不接受数据帧的结构,因为它有一个数组

所以我的问题是,有没有办法将 foo 和 bar 列的数组展平并将它们的值转换为字符串?

这是我到目前为止将项目作为数组获取的内容

val basketItems = df.select($"OrderContainer.BasketInfo.BasketId",
  $"OrderContainer.BasketInfo.MenuId",
  explode($"OrderContainer.BasketInfo.Items")).toDF("BasketId","MenuId","Items")

这是我正在使用的 json(为便于阅读而格式化):


   "OrderContainer":
      "BasketInfo":
         "BasketId":"kjOIxlJFc0WYdQXm2AXksg",
         "MenuId":119949,
         "Items":[
            
               "ProductId":12310,
               "UnitPrice":5.5,
               "foo":[1,2,3],
               "bar":["a","b","c"]
            ,
            
               "ProductId":456323,
               "UnitPrice":5.5,
               "foo":[1,2,3],
               "bar":["a","b","c"]
            ,
            
               "ProductId":23432432,
               "UnitPrice":5.5,
               "foo":[1,2,3],
               "bar":["a","b","c"]
            
         ]
      
   

【问题讨论】:

您真的打算在您的 Redshift 数据Items 中包含一个以逗号分隔的混杂文本字段吗?如果是这样,您可以使用一些分隔符来展平数组。否则,您可以为 Items 创建一个单独的表 感谢@Kristian,这只是项目的架构,根本不会是一堆乱七八糟的文字。无论如何感谢您的建议:) 【参考方案1】:

仅供参考

我已经通过创建一个使数组成为字符串的函数来解决它。

val mkString = udf((a: Seq[Any]) => a.mkString(","))

确保导入 udf 函数。

那么你只需要使用 withColumn 函数。

.withColumn("foo", mkString($"foo"))

【讨论】:

以上是关于火花红移。将数组展平为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中将多维数组“展平”为简单数组? [复制]

如何在 PHP 中将多维数组“展平”为简单数组? [复制]

无法从火花连接到红移

Spark Redshift:使用火花读取红移表时出错

将嵌套的空值转换为数据框火花内的空字符串

有没有办法在火花流中展平嵌套的 JSON?