繁体   English   中英

创建Hive表-如何从CSV源导出列名?

[英]Creating Hive table - how to derive column names from CSV source?

...我真的认为这将是一条遍历的道路。

我想通过检查暴露(通常是这样)列名的CSV文件中的第一条记录,在Hive中创建DDL语句(或针对此问题的SQL)。

我已经看到了许多解决此问题的方法,但没有很多方法可以自动执行或大规模复制。

我创建了以下代码来处理该任务,但是我担心它存在一些问题:

#!/usr/bin/python

import sys
import csv

# get file name (and hence table name) from command line
# exit with usage if no suitable argument

if len(sys.argv) < 2:
   sys.exit('Usage: ' + sys.argv[0] + ': input CSV filename')
ifile = sys.argv[1]

# emit the standard invocation
print 'CREATE EXTERNAL TABLE ' + ifile + ' ('

with open(ifile + '.csv') as inputfile:
   reader = csv.DictReader(inputfile)
   for row in reader:
      k = row.keys()
      sprung = len(k)
      latch = 0
      for item in k:
         latch += 1
         dtype = '` STRING' if latch == sprung else '` STRING,'
         print '`' + item.strip() + dtype
      break
   print ')\n'

print "ROW FORMAT DELIMITED FIELDS TERMINATED BY ','"
print "LOCATION 'replacethisstringwith HDFS or S3 location'"

首先是它只是将所有数据类型化为STRING。 (我想这是来自CSV的错误,这是可以原谅的。当然,可以修改结果以更准确地设置数据类型。)

第二个问题是,它不会清除Hive表列名中不允许使用的潜在列名。 (通过读取通常列名称通常带有撇号的数据集,我很容易立即破坏了它。这造成了混乱。)

第三是数据位置已标记。 我想只需多一点的编码时间,它就可以在命令行中作为参数传递。

我的问题是-为什么我们需要这样做? 我缺少什么简单的方法来做到这一点?

(顺便说一句:引用CSV Serde并没有加分-我认为这仅在Hive 14中可用。我们中的许多人离我们的生产系统还差得远。)

关于第一个问题(所有列都键入为字符串),即使表正在由CSVSerde或RegexSerDe之类的东西处理,这实际上也是当前行为。 根据您的用例的细节是否可以忍受额外的运行时延迟,一种可能的方法是根据您的外部表定义一个视图,该视图在查询时动态重铸列,并针对该视图而不是外部表直接进行查询。 就像是:

CREATE VIEW VIEW my_view (
  CAST(col1 AS INT) AS col1,
  CAST(col2 AS STRING) AS col2,
  CAST(col3 AS INT) as col3,
  ...
  ...
) AS SELECT * FROM my_external_table;

对于第二个问题(清理列名),我推断您的Hive安装为0.12或更早版本(0.13支持列名中的任何Unicode字符)。 如果导入re regex模块,则可以在Python中执行以下清理操作:

for item in k:
  ...
  print '`' + re.sub(r'\W', '', item.strip()) + dtype

这应该摆脱任何非字母/下划线字符,这是Hive列名称的0.13之前的期望值。 顺便说一句,如果您以这种方式对列名称进行消毒,我认为您不再需要周围的引号。

至于第三个问题(外部表的位置),我认为将位置指定为命令行参数是一种合理的方法。 一种替代方法是在数据文件中添加另一种“ metarow”以某种方式指定位置,但是如果您已经坐在大量数据文件上,那将是一件痛苦的事情-我个人更喜欢命令行方法。

Kite SDK具有以下功能:使用标题记录中的名称和前几个数据记录中的类型来推断CSV模式,然后根据该模式创建Hive表。 您也可以使用它将CSV数据导入该表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM