hive的sql大全

有一个人员关联地址表,分别有身份证号,姓名,地址名称,数据来源,登记时间,怎样求出每个人的地址,关联次数,数据来源集合 其中数据来源集合要求用数据来源和更新时间拼起来进行集合,并且要求数据来源集合中按照更新时间进行排序 要求用hive实现


SELECT id_card, name, address_name, count(*) as association_count,
       collect_set(concat(data_source, '-', register_time)) as data_sources
FROM person_address
GROUP BY id_card, name, address_name
ORDER BY id_card;

你试试呢,不知道你的表名和字段,全用中文代替

SELECT
    身份证号,
    姓名,
    地址名称,
    count( * ) AS 关联次数,
    sort_array ( collect_set ( concat_ws( ‘ |’, 数据来源, 登记时间 ) ) ) AS 数据来源集合 
FROM
    人员关联地址表 
GROUP BY
    身份证号,
    姓名,
    地址名称;

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7711102
  • 这篇博客也不错, 你可以看下hive sql 时间比较、小数点为位
  • 除此之外, 这篇博客: Hive数据倾斜的原因及其解决方案(hive SQL调优)有实例加深理解中的 特殊情况特殊处理: 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:
    为了实现这个查询,你可以按如下步骤编写Hive的SQL语句:
    
    1. 首先,创建一个名为person_address的Hive表,使用提供的表结构和示例数据。
    
    ```sql
    CREATE TABLE person_address (
      id_card STRING,
      name STRING,
      address_name STRING,
      data_source STRING,
      register_time STRING
    );
    
    INSERT INTO TABLE person_address VALUES
    ('1234567890', 'John Doe', 'Address 1', 'Source A', '2022-01-01'),
    ('1234567890', 'John Doe', 'Address 2', 'Source B', '2022-02-01'),
    ('0987654321', 'Jane Doe', 'Address 3', 'Source A', '2022-03-01'),
    ('0987654321', 'Jane Doe', 'Address 4', 'Source B', '2022-04-01'),
    ('0987654321', 'Jane Doe', 'Address 5', 'Source A', '2022-05-01');
    
    1. 接下来,编写一个Hive查询,以求出每个人的地址、关联次数和数据来源集合。
    SELECT id_card, name, count(*) as num_associations, 
           concat_ws(',', collect_set(concat(data_source, ' ', register_time))) as data_source_list
    FROM person_address
    GROUP BY id_card, name;
    

    这个查询使用了GROUP BY子句对id_card和name进行分组,并使用count(*)函数计算出每个组的关联次数。同时使用collect_set函数和concat函数将data_source和register_time拼接起来,形成一个数据来源集合。

    希望这个解决方案对你有帮助!如果你还有其他问题,请随时提问。 ```


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^