Hive学习:Hive导入字段带逗号和换行符的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即可
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱夜来香A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值