2013-07-30 115 views
1

从具有管分隔符的巨大文件创建包含大量列(字符串)(> 100)的Hive表的最佳方式是什么?Hive创建包含大量列的表

  1. 如果我在create table命令中提到超过100个列名,会出现问题吗?
  2. 如果我决定不想命名每个列,我可以a)根本不提及列名称,并让Hive按照其默认命名命名列名称。我该怎么做b)提及只有一些列表示第一个10.在这种情况下剩余列会发生什么? 我试着这样说:

    CREATE EXTERNAL TABLE IF NOT EXISTS table1 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' 
    LOCATION 'folder1/folder2/folder3/filename'; 
    

我得到一个错误说“列列出或应指定自定义序列”。我需要一个自定义序列化程序吗? 如果外部表没有分区,我该如何添加分区?

+0

你可以在apache drill或impala中做到这一点 – nir

+0

如果你创建一个只有一个字符串列的导入表,并以这种方式引用文件,它可能会工作。然后,您可以使用'create table as'语句来执行一个查询,该查询使用可能的split来从字符串中生成数组,然后使用explode语句将其转换为表格。虽然从这里拍摄臀部...... – LiMuBei

回答

-1
  1. 为配置单元中的表创建创建通用脚本。 这里采取的分隔符,路径,表名和模式使用动态hiveconf

    创建表$ {hiveconf:表名}($ {hiveconf:模式})通过 '$ {hiveconf:分隔符}' 终止 行格式分隔的字段 位置'$ {hiveconf:location}';

  2. 写一个外壳脚本用于运行上述脚本

    蜂房-hiveconf表名= $ 1 -hiveconf架构= $ 16 -hiveconf定界符= $ 3 -hiveconf位置= $ 4 -f abovefilpath.q

3.pass参数shell脚本,运行shell脚本

sh secondstepshellscriptpath urtblname schema details urdelimiter hdfspath 

用上面的方法,你可以创建一个表的任何数量的列,这是非常reusab乐。

在这里,您有一些其他的工具,这将产生输出类似下面准备模式..

"col1 string,sol2 string,col3 string,col4 string etc..." 

例如,你可以通过从user.And可以在拍摄的列数动态生成上述shell脚本中输出直接从第二步直接传递该模式。

+1

这并不能回答他的任何一个问题。这种方法只能让一个人避免输入部分命令语法来创建一个表。 –

+0

增加额外的信息,关于我的意思 –

+0

OP不问如何减少他的写作创建语句的工作。他在问如何以部分结构化或非结构化的方式来定义它。 –