我如何使用 jsonloader 为数组定义模式?

Posted

技术标签:

【中文标题】我如何使用 jsonloader 为数组定义模式?【英文标题】:How i can define schema for array using jsonloader? 【发布时间】:2015-04-07 20:45:42 【问题描述】:

我正在使用大象鸟项目将 json 文件加载到猪。 但我不确定如何在加载时定义架构。没有找到相同的描述。

数据:

"id":22522,"name":"Product1","colors":["Red","Blue"],"sizes":["S","M"]
"id":22523,"name":"Product2","colors":["White","Blue"],"sizes":["M"]

代码:

feed = LOAD '$INPUT' USING com.twitter.elephantbird.pig.load.JsonLoader() AS products_json;

extracted_products = FOREACH feed GENERATE
    products_json#'id' AS id,
    products_json#'name' AS name,
    products_json#'colors' AS colors,
    products_json#'sizes' AS sizes;

describe extracted_products;

结果:

extracted_products: id: chararray,name: bytearray,colors: bytearray,sizes: bytearray

如何为它们提供正确的架构(int、string、array、array)以及如何将数组元素展平为行?

提前致谢

【问题讨论】:

我已经尝试过 (chararray)products_json#'id' 并且有效,但它不是太复杂并且不确定我应该如何转换数组。 Pig 不支持数组类型的数据类型。一种选择是您可以将其存储为 chararray。 【参考方案1】:

将json数组转换为元组:

feed = LOAD '$INPUT' USING com.twitter.elephantbird.pig.load.JsonLoader() AS products_json;

extracted_products = FOREACH feed GENERATE
products_json#'id' AS id:chararray,
products_json#'name' AS name:chararray,
products_json#'colors' AS colors:t:(i:chararray),
products_json#'sizes' AS sizes:t:(i:chararray);

扁平化一个元组

flattened = foreach extracted_products generate id,flatten(colors);

【讨论】:

以上是关于我如何使用 jsonloader 为数组定义模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pig 中使用 JsonLoader 加载数据

如何在 iOS 的 iCarousel 中显示图像全屏?

为啥大象鸟猪 JsonLoader 只处理我的文件的一部分?

使用JSONLoader在threejs上导入3d对象

使用three.js JSONLoader

带纹理的 JSONLoader