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

时间:2016-07-13 15:11:24

标签: scala apache-spark dataframe amazon-redshift scala-collections

我正在尝试使用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"]
            }
         ]
      }
   }
}

1 个答案:

答案 0 :(得分:0)

仅供参考

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

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

确保导入udf函数。

然后你必须使用的是withColumn函数。

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