上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

Hive学习:Hive导入字段带逗号和换行符的CSV文件

guduadmin21天前

Hive Handler Csv

    • 一、字段带逗号
    • 二、字段带换行符
    • 三、字段带逗号和换行符

      一、字段带逗号

      100,"600,000,000.00",李世民
      

      比如上面这行数据,字段"600,000,000,00"带多个逗号,这个可以用hive中内置的语句来解决,使用OpenCSVSerde来解析CSV格式的数据,并指定了CSV文件中使用的分隔符、引号字符和转义字符

      row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
      with serdeproperties (
          'separatorChar' = ',',
          'quoteChar' = '\"',
          'escapeChar' = '\'
      ) 
      
      • ‘separatorChar’ = ‘,’:指定CSV文件中使用的分隔符为逗号(,)
      • ‘quoteChar’ = ‘"’:指定CSV文件中使用的引号字符为双引号(")
      • ‘escapeChar’ = ‘\’:指定CSV文件中使用的转义字符为反斜杠(\)

        这段代码表示分隔符为逗号,""中间的逗号不进行处理

        二、字段带换行符

        Name,Age,Address
        Alice,25,"123 Main St.
        Apt. 456"
        Bob,30,"789 Oak St."
        

        比如上面这段数据,本来是两条数据,但第一条数据第三个字段中间多了个换行符,在load data进hive的时候就变成了三条数据

        网上找了很久,没有看到hive能直接处理这种字段中间带换行符的方式,所以只能对csv文件进行预处理

        1、用shell脚本sed命令正则表达式匹配替换""中间的换行符

        2、用其它语言脚本处理csv文件替换换行符

        #!/usr/bin/python
        # -*- coding:utf-8 -*-
         
        #处理csv文件中换行符等特殊字符(\r\n,\n,\r,\)
        #python csv_handler.py filepath
         
        import os
        import sys
        import csv
        import codecs
        import time
         
        filename = sys.argv[1]
         
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),'[', filename.encode('unicode_escape').decode(), ']开始处理')
         
        with open(filename, 'r') as srcFile, open(filename + '.tmp', 'w') as dstFile:
            #读取csv文件的每一行
            fileReader = csv.reader(srcFile)
            fileWriter = csv.writer(dstFile, quoting=csv.QUOTE_ALL)
         
            for d in list(fileReader):
                for ii,dd in enumerate(d):
                    if dd.find('\r\n') != -1:
                        dd = dd.replace('\r\n', ' ')
                    if dd.find('\n') != -1:
                        dd = dd.replace('\n', ' ')
                    if dd.find('\r') != -1:
                        dd = dd.replace('\r', ' ')
                    if dd.find('\') != -1:
                        dd = dd.replace('\', '')
                    d[ii] = dd
                fileWriter.writerow(d)
         
            dstFile.close()
            srcFile.close()
         
        #删除原文件,.tmp文件重命名为原文件
        os.remove(filename)
        os.rename(filename + '.tmp', filename)
         
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),'[', filename.encode('unicode_escape').decode(), ']处理完成')
        

        三、字段带逗号和换行符

        • 直接把上面两种结合起来就可以了,建表使用字段带逗号那里的方式,然后预处理CSV文件,最后直接load data即可

网友评论

搜索
最新文章
热门文章
热门标签