我需要从CSV文件中重复加载数据,该数据要放入具有预定义结构的输出文件/表中。但是,每次迭代中输入文件的列名可能会略有变化。
例如,列名在第一次迭代中将为“ Serial_Num”,而在下次迭代中可能以“ Serial_Number”显示。
如果我定义的数据目录表的列名称为“ Serial_Num”,我是否可以编码该名称的可能变体并将它们全部映射到已定义的列“ Serial_Num”?
我知道,列名每次都可能带有不同的变体,并且可能不遵循通用模式。我希望定义一些在逻辑上可以预期的模式,以便可以避免手动干预。
答案 0 :(得分:0)
如果每个csv文件都将具有第一行作为标题,则可以在athena上使用以下语法在Glue Catalog中创建所需的表:
CREATE EXTERNAL TABLE IF NOT EXISTS {{tablename}} ({{headers}})
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES ( 'escapeChar'='/', 'quoteChar'='\\"', 'separatorChar'=',')
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION '{{location}}' TBLPROPERTIES ('skip.header.line.count'='1')"
用相应的值替换占位符{{tablename}},{{headers}}和{{location}}。
甚至更好的解决方案是停止在CSV本身中生成标题行,然后您可以在雅典娜中或通过Glue Crawler在CREATE EXTERNAL TABLE命令的基础上强加自己的模式/标题。