雪花 - 横向展平创建重复行

时间:2021-05-27 20:01:14

标签: snowflake-cloud-data-platform

我正在从另一个表 (my_existing_table) 创建一个新表 (my_new_table),该表有 4 列,product 和monthly_budget 具有我试图提取的嵌套值:

Product 列是这样的字典:

{"name": "Display", "full_name": "Ad Bundle"}

MONTHLY_BUDGETS 是一个包含多个字典的列表,列如下所示:

[{"id": 123, "quantity_booked": "23", "budget_booked": "0.0", "budget_booked_loc": "0.0"} , 
{"id": 234, "quantity_booked": "34", "budget_booked": "0.0", "budget_booked_loc": "0.0"}, 
{"id": 455, "quantity_booked": "44", "budget_booked": "0.0", "budget_booked_loc": "0.0"}]

以下是我为创建新表并从另一个表中取消嵌套所做的工作:

CREATE OR REPLACE TABLE my_new_table as (
 with og_table as (             
    select
      id,
      parse_json(product) as PRODUCT,
      IO_NAME,        
      parse_json(MONTHLY_BUDGETS) as MONTHLY_BUDGETS
    from my_existing_table
) 
    select
      id,
      PRODUCT:name::string as product_name,
      PRODUCT:full_name::string as product_full_name,
      IO_NAME,           
      MONTHLY_BUDGETS:id::integer as monthly_budgets_id,
      MONTHLY_BUDGETS:quantity_booked::float as monthly_budgets_quantity_booked,
      MONTHLY_BUDGETS:budget_booked_loc::float as monthly_budgets_budget_booked_loc
      from og_table,
      lateral flatten( input => PRODUCT) as PRODUCT,
      lateral flatten( input => MONTHLY_BUDGETS) as MONTHLY_BUDGETS);      
             

但是一旦我的新表被创建并且我运行这个: 选择不同的 id, count(*) 来自 my_new_table 其中 id = '123' 按 1 分组;

当我应该只有 1 时,我在 count(*) 列下看到 18,所以看起来有很多重复,但为什么呢?以及如何防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

LATERAL FLATTEN 在输入行和展平结果之间产生一个 CROSS JOIN。

所以如果我们有这些数据

all_runlengths = np.vstack(runlength_chunks).astype(dtype)

然后您通过以下方式对 Array 进行展平:

Id, Array
1, [10,20,30]
2, [40,50,60]
SELECT d.id,
  d.array,
  f.value as val
FROM data d
LATERAL FLATTEN(input => d.array) f

对于你的情况,如果你为每个 ID 做两个展平,你会有很多重复的 ID 行。

就像上面一样,如果在我的输出中执行 Id, Array, val 1, [10,20,30], 10 1, [10,20,30], 20 1, [10,20,30], 30 2, [40,50,60], 40 2, [40,50,60], 50 2, [40,50,60], 60 我将拥有值 SELECT ID, count(*) FROM output GROUP BY 11,3