如何将JSON对象正确存储到表中?

时间:2018-04-06 22:37:09

标签: azure-data-lake

我正在处理我的Data Lake Store中可用发票的情况。

发票示例(极简化):

{
   "business_guid":"b4f16300-8e78-4358-b3d2-b29436eaeba8",
   "ingress_timestamp": 1523053808,
   "client":{
      "name":"Jake",
      "age":55
   },
   "transactions":[
      {
         "name":"peanut",
         "amount":100
      },
      {
         "name":"avocado",
         "amount":2
      }
   ]
}

所有发票都存储在ADLS中,可以查询。但是,我希望能够访问ALD DB中的相同数据。

我不是未构造数据的专家:我有RDBMS背景。考虑到这一点,我只能想到两种可能的情况:

  1. 2/3表 - 发票,客户(可以删除)和交易。在这种情况下,我必须创建一个发票ID才能在这些表之间建立关系
  2. 1表 - 客户信息可以标准化为发票数据。但是,交易可以(可能)定义为SQL.ARRAY<SQL.MAP<string, object>>
  3. 我主要有3个问题:

    1. 这样做的正确方法是什么?解决方案1似乎结构更好。
    2. 如果我使用解决方案1,如何正确创建ID(可能是GUID)?在使用ADL时是否可以要求创建ID?
    3. 我在这里缺少另一种解决方案吗?
    4. 提前致谢!

1 个答案:

答案 0 :(得分:0)

这类问题有点像你喜欢意大利面上的酱汁或意大利面:)。答案是:它取决于。

更认真地回答你的3个问题:

  1. #1具有规范化的好处,如果您想单独操作数据(例如,仅仅是客户端,只是发票,只是交易),并希望获得规范化的好处,获得正确的索引,并且不受行大小限制的限制(例如,您的地图数组需要适合行)。所以除非您的交易数据总是很小并且您总是一起访问数据并主要搜索列数据,否则我会建议这种方法。

  2. U-SQL本身并不了解JSON文档的层次结构。因此,您必须编写一个提取器,将您的JSON转换为行,以便它为您提供父项与子项的相关性(通常通过逐步向下导航和交叉应用完成)并使用父项的键值数据项作为外键,或让提取器生成密钥(如int或guid)。

  3. U-SQL GitHub站点上有一些示例JSON提取器(从http://usql.io开始),它可以帮助您开始使用JSON到行集转换。请注意,您可能希望在某些时候优化提取是基于JSON Reader的,这样您就可以处理较大的文档而无需将其加载到内存中。