[英]ER Diagram based on multiple databases & tables which derive names from column values from other table
[英]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.