数据重述

问题描述 投票:0回答:1

我有一个名为“old_table”的表,它是一个外部表,它有 8 列,分别是姓名、地点、出生日期、爱好、学校、性别、班级、详细信息。这里的详细信息列是一个结构数组类型,例如它的值类似于 [{age:23, orphan:no, alive:yes, sex:Male, class:6},{age:20, orphan:yes, alive:Yes ,性别:女,班级:8},等等]。

最近我们在这个详细信息列中又添加了 2 个字段,即 name 和 place,所以现在的结构是 [{age:23, orphan:no, alive:yes,ender:Male, class:6, name:raju, place:孟买},{年龄:20,孤儿:是,活着:是,性别:女,班级:8,姓名:raju,地点:孟买},等等]。

该表是分区表。我们从 1 月 7 日起使用这两个字段更新了表,因此我希望旧分区也使用从各自列中获取的值进行更新。这 2 个字段必须从名称和地点这两列中获取值。

我使用更新后的架构创建了一个 new_table,并从 old_table 复制了数据,现在所有行的这 2 个字段均为空,如何使用从各自列中获取的值来更新这些值?我想要对此进行配置单元查询,我注意到的一件事是,当我通过配置单元检查此模式(即使是旧分区)时,它显示更新的模式,但是当我通过 Spark 检查它时,我得到的是旧模式。

sql apache-spark hadoop join hive
1个回答
0
投票

你可以像这样插入覆盖

INSERT OVERWRITE TABLE old_table
SELECT
  name,
  place,
  dob,
  hobby,
  school,
  gender,
  class,
  TRANSFORM(details, e -> named_struct('age', e.age, 'orphan', e.orphan, 'alive', e.alive, 'gender', e.gender, 'class', e.class, 'name', name, 'place', place)) as details
FROM old_table;

那么你需要修理你的桌子

MSCK REPAIR TABLE old_table;

为什么我们需要

MSCK REPAIR TABLE:

Partition Discovery:
If you've added or removed partitions manually in HDFS (for example, through external tools or scripts), Hive might not automatically recognize these changes. Running MSCK REPAIR TABLE helps Hive discover and register the new partitions.
Schema Mismatch:
When there's a discrepancy in schema information between Hive and the actual data files in HDFS, running MSCK REPAIR TABLE can help reconcile these differences.
© www.soinside.com 2019 - 2024. All rights reserved.