创建配置单元表-如何从csv源中派生列名?

f45qwnt8  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(317)

……我真的以为这条路会很好走。
我想通过检查csv文件中的第一条记录来创建hive(或sql)中的ddl语句,该文件公开了列名(通常是这样)。
对于这个问题,我已经看到了各种近似的答案,但没有多少是可以自动化或大规模复制的。
我创建了以下代码来处理该任务,但我担心它有一些问题:


# !/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'"

首先,它只是将所有数据类型化为一个字符串(我想从csv来的,那是可以原谅的罪。当然,还可以对结果进行修改,以便更准确地设置数据类型。)
第二个问题是它不会清除配置单元表列名中不允许的字符的潜在列名(我很容易通过读入一个数据集立即打破它,其中的列名通常有一个撇号作为数据。这造成了混乱。)
第三是数据位置被标记化。我想只要多花一点编码时间,它就可以作为参数在命令行上传递。
我的问题是——我们为什么要这么做?我错过了什么简单的方法?
(顺便说一句:引用csv服务器没有加分-我认为这只在hive14中可用。我们中的许多人对生产系统的了解还不够。)

yv5phkfx

yv5phkfx1#

kitesdk的功能是用头记录中的名称和前几个数据记录中的类型推断csv模式,然后从该模式创建一个配置单元表。您还可以使用它将csv数据导入到该表中。

pdkcd3nj

pdkcd3nj2#

关于第一个问题(所有列都被类型化为字符串),这实际上是当前的行为,即使表是由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;

对于第二个问题(清除列名),我推断您的配置单元安装是0.12或更早版本(0.13支持列名中的任何unicode字符)。如果导入 re 在regex模块中,您可以使用以下方法在python中执行清理:

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

这应该去掉任何非alphernumeric/下划线字符,这是0.13之前对配置单元列名的期望。顺便说一句,如果你用这种方式清理列名,我认为你不再需要周围的反记号了。
至于第三个问题(外部表位置),我认为将位置指定为命令行参数是一种合理的方法。另一种选择可能是在数据文件中添加另一个“metarow”,以某种方式指定位置,但如果您已经坐在大量的数据文件上,那将是一种痛苦——我个人更喜欢命令行方法。

相关问题