Hadoop 使用默认SerDE加载配置单元表数据

Hadoop 使用默认SerDE加载配置单元表数据,hadoop,hive,Hadoop,Hive,数据采用以下格式 a、 “b,c”,d,e p、 q,“e,r”,t a、 s,“t,g”,t 我想创建一个蜂巢表 Col1,Col2,Col3,Col4 a、b、c、d、e p,q,e,r,t a,s,t,g,t 如上所述,如果数据封装在双引号中,则在创建表数据时不应考虑中间的逗号。如果使用默认的SerDe,则忽略双引号,并将b、c视为两个独立的列 如何确保双引号将忽略两个元素之间的逗号(如果封装在双引号中)如果可能且可行,我首先建议您研究一下输入数据是否可以以这样一种方式进行清理,使用逗号以

数据采用以下格式

a、 “b,c”,d,e

p、 q,“e,r”,t

a、 s,“t,g”,t

我想创建一个蜂巢表

Col1,Col2,Col3,Col4

a、b、c、d、e

p,q,e,r,t

a,s,t,g,t

如上所述,如果数据封装在双引号中,则在创建表数据时不应考虑中间的逗号。如果使用默认的SerDe,则忽略双引号,并将b、c视为两个独立的列


如何确保双引号将忽略两个元素之间的逗号(如果封装在双引号中)

如果可能且可行,我首先建议您研究一下输入数据是否可以以这样一种方式进行清理,使用逗号以外的内容作为字段分隔符。使用数据中自然出现的定界模式总是很危险的

但如果不可能,那么有一种基于正则表达式的方法来检测引号逗号:

  • 首先,将数据作为单列行(每行包含整行)摄取到暂存表中
  • 检测引号之间出现的逗号,并将其替换为人工占位符
  • 使用逗号作为分隔符拆分结果字符串
  • 将人工占位符替换为它们最初表示的逗号
  • 作为一个精心设计的具体示例,我用您的数据加载了以下单列暂存表(步骤1):

    然后,下面的查询生成最终的目标表

    DROP TABLE IF EXISTS test;
    CREATE TABLE test (
        Col1 STRING,
        Col2 STRING,
        Col3 STRING,
        Col4 STRING
      );
    INSERT INTO TABLE test SELECT
      regexp_replace(fields[0], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[1], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[2], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[3], "\\[QUOTEDCOMMA\\]", ",")   -- Step #4
    FROM (
      SELECT split(  -- Step #2 and #3
        regexp_replace(rawline, "\"([^,]*),([^,]*)\"", "$1[QUOTEDCOMMA]$2"),
        ',') AS fields
      FROM staging
    ) t;
    
    这将生成以下最终表格
    测试

    hive> SELECT * FROM test;
    OK
    a   b,c     d        e
    p   q       e,r      t
    a   s       t,g      t
    Time taken: 0.196 seconds, Fetched: 3 row(s)
    

    在这个示例实现中,字符串
    [QUOTEDCOMMA]
    被用作引号之间逗号的人工占位符。这个选择完全是任意的,实际上,如果你选择这个方法,你会希望确保你的占位符不会自然出现在你的数据中。

    如果这是可行的,我首先建议你探索一下输入数据是否可以以这样一种方式净化,使用逗号以外的东西作为字段分隔符。使用数据中自然出现的定界模式总是很危险的

    但如果不可能,那么有一种基于正则表达式的方法来检测引号逗号:

  • 首先,将数据作为单列行(每行包含整行)摄取到暂存表中
  • 检测引号之间出现的逗号,并将其替换为人工占位符
  • 使用逗号作为分隔符拆分结果字符串
  • 将人工占位符替换为它们最初表示的逗号
  • 作为一个精心设计的具体示例,我用您的数据加载了以下单列暂存表(步骤1):

    然后,下面的查询生成最终的目标表

    DROP TABLE IF EXISTS test;
    CREATE TABLE test (
        Col1 STRING,
        Col2 STRING,
        Col3 STRING,
        Col4 STRING
      );
    INSERT INTO TABLE test SELECT
      regexp_replace(fields[0], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[1], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[2], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[3], "\\[QUOTEDCOMMA\\]", ",")   -- Step #4
    FROM (
      SELECT split(  -- Step #2 and #3
        regexp_replace(rawline, "\"([^,]*),([^,]*)\"", "$1[QUOTEDCOMMA]$2"),
        ',') AS fields
      FROM staging
    ) t;
    
    这将生成以下最终表格
    测试

    hive> SELECT * FROM test;
    OK
    a   b,c     d        e
    p   q       e,r      t
    a   s       t,g      t
    Time taken: 0.196 seconds, Fetched: 3 row(s)
    

    在这个示例实现中,字符串
    [QUOTEDCOMMA]
    被用作引号之间逗号的人工占位符。这个选择完全是任意的,实际上,如果你选择这个方法,你会希望确保你的占位符不会自然出现在你的数据中。

    如果这是可行的,我首先建议你探索一下输入数据是否可以以这样一种方式净化,使用逗号以外的东西作为字段分隔符。使用数据中自然出现的定界模式总是很危险的

    但如果不可能,那么有一种基于正则表达式的方法来检测引号逗号:

  • 首先,将数据作为单列行(每行包含整行)摄取到暂存表中
  • 检测引号之间出现的逗号,并将其替换为人工占位符
  • 使用逗号作为分隔符拆分结果字符串
  • 将人工占位符替换为它们最初表示的逗号
  • 作为一个精心设计的具体示例,我用您的数据加载了以下单列暂存表(步骤1):

    然后,下面的查询生成最终的目标表

    DROP TABLE IF EXISTS test;
    CREATE TABLE test (
        Col1 STRING,
        Col2 STRING,
        Col3 STRING,
        Col4 STRING
      );
    INSERT INTO TABLE test SELECT
      regexp_replace(fields[0], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[1], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[2], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[3], "\\[QUOTEDCOMMA\\]", ",")   -- Step #4
    FROM (
      SELECT split(  -- Step #2 and #3
        regexp_replace(rawline, "\"([^,]*),([^,]*)\"", "$1[QUOTEDCOMMA]$2"),
        ',') AS fields
      FROM staging
    ) t;
    
    这将生成以下最终表格
    测试

    hive> SELECT * FROM test;
    OK
    a   b,c     d        e
    p   q       e,r      t
    a   s       t,g      t
    Time taken: 0.196 seconds, Fetched: 3 row(s)
    

    在这个示例实现中,字符串
    [QUOTEDCOMMA]
    被用作引号之间逗号的人工占位符。这个选择完全是任意的,实际上,如果你选择这个方法,你会希望确保你的占位符不会自然出现在你的数据中。

    如果这是可行的,我首先建议你探索一下输入数据是否可以以这样一种方式净化,使用逗号以外的东西作为字段分隔符。使用数据中自然出现的定界模式总是很危险的

    但如果不可能,那么有一种基于正则表达式的方法来检测引号逗号:

  • 首先,将数据作为单列行(每行包含整行)摄取到暂存表中
  • 检测引号之间出现的逗号,并将其替换为人工占位符
  • 使用逗号作为分隔符拆分结果字符串
  • 将人工占位符替换为它们最初表示的逗号
  • 作为一个精心设计的具体示例,我用您的数据加载了以下单列暂存表(步骤1):

    然后,下面的查询生成最终的目标表

    DROP TABLE IF EXISTS test;
    CREATE TABLE test (
        Col1 STRING,
        Col2 STRING,
        Col3 STRING,
        Col4 STRING
      );
    INSERT INTO TABLE test SELECT
      regexp_replace(fields[0], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[1], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[2], "\\[QUOTEDCOMMA\\]", ","),  -- Step #4
      regexp_replace(fields[3], "\\[QUOTEDCOMMA\\]", ",")   -- Step #4
    FROM (
      SELECT split(  -- Step #2 and #3
        regexp_replace(rawline, "\"([^,]*),([^,]*)\"", "$1[QUOTEDCOMMA]$2"),
        ',') AS fields
      FROM staging
    ) t;
    
    这将生成以下最终表格
    测试

    hive> SELECT * FROM test;
    OK
    a   b,c     d        e
    p   q       e,r      t
    a   s       t,g      t
    Time taken: 0.196 seconds, Fetched: 3 row(s)
    
    在这个示例实现中,字符串
    [QUOTEDCOMMA]
    被用作引号之间逗号的人工占位符。这个选择完全是随意的,实际上,如果你走这条路,你会想确保你的占位符不会被nat占用