IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 文本文件清洗入库(MySQL)一例 -> 正文阅读

[大数据]文本文件清洗入库(MySQL)一例

一、需求

? ? ? ? 有一批文本文件如下:
numt_qe_0411.txt
numt_qe_0412.txt
numt_qe_0413.txt
numt_qe_0414.txt
...

? ? ? ? 每个文件的内容格式如下:
9435446,问题1:,答案1
9575177,问题2? ,答案2
9575177,问题3? ,答案3
...

? ? ? ? 可能存在以下几种情况:
1. 文件中有空行
2. 行中可能存在Tab符
3. 可能存在错误折行的情况,如:
9594287,您的性别:,男
9594287,您的年龄: ,70
~80岁
9594287,您的学历:,大专

应为:
9594287,您的性别:,男
9594287,您的年龄: ,70~80岁
9594287,您的学历:,大专


? ? ? ? 要求将所有文件内容导入如下结构的 t1 表中:

+----------+--------------+------+-----+---------+----------------+
| Field ? ?| Type ? ? ? ? | Null | Key | Default | Extra ? ? ? ? ?|
+----------+--------------+------+-----+---------+----------------+
| id ? ? ? | bigint(20) ? | NO ? | PRI | NULL ? ?| auto_increment |
| sdate ? ?| date ? ? ? ? | YES ?| ? ? | NULL ? ?| ? ? ? ? ? ? ? ?|
| userid ? | bigint(20) ? | YES ?| ? ? | NULL ? ?| ? ? ? ? ? ? ? ?|
| qu_title | varchar(500) | YES ?| ? ? | NULL ? ?| ? ? ? ? ? ? ? ?|
| qu_item ?| varchar(255) | YES ?| ? ? | NULL ? ?| ? ? ? ? ? ? ? ?|
| dstate ? | int(255) ? ? | YES ?| ? ? | 0 ? ? ? | ? ? ? ? ? ? ? ?|
+----------+--------------+------+-----+---------+----------------+

? ? ? ? 第一个逗号之前为一列,对应到字段userid,最后一个逗号后面为第三个字段,对应到字段qu_item;中间内容对应到 字段qu_title;文件名中的日期,导入的时候写到字段 sdate。并且由于资源限制,一次性导入整个一个文件会使得服务器卡死。

二、方案

? ? ? ? 先处理文本文件,去掉空行和Tab符号,然后将一个大文件分割成若干小文件。将每个小文件的数据导入一个中间过渡表,之后再将用SQL查询中的字符串和窗口函数处理后的结果插入目标表。

三、实现

1. 创建过渡表

create table t_question (`txt` text) engine=innodb default charset=utf8mb4;

2. 文本文件处理

(1)改成unix格式

cd /data/software/xxqg/
dos2unix *.txt

(2)去掉空行

sed -i '/^$/d' *.txt

(3)Tab符替换为空格

sed -i 's/\t/ /g' *.txt

(4)分成100000行一个的小文件

mkdir small_file
cd small_file
split -l 100000 -d -a 5 ../numt_qe_0411.txt 04_11_
split -l 100000 -d -a 5 ../numt_qe_0412.txt 04_12_
split -l 100000 -d -a 5 ../numt_qe_0413.txt 04_13_
split -l 100000 -d -a 5 ../numt_qe_0414.txt 04_14_
...

(5)生成SQL命令文件

ls -l | awk '{print "truncate table t_question; load data infile '\''\/data\/software\/xxqg\/small_file\/"$9 "'\'' into table t_question ;"}' | grep 04 > sql_cmd.sql

3. 入库执行内容如下的load_to_table.sh脚本文件

#!/bin/bash
source ~/.bashrc

cat /data/software/xxqg/small_file/sql_cmd.sql|while read line
do
? ? read mon day <<< `echo $line | awk -F/ '{print $6}' | awk -F_ '{print $1,$2}'`
? ? sdate='2022-'$mon'-'$day

? ? # userid >= 1000000 为正常数据
? ? # userid < 1000000 为错误折行数据,用lag函数合并到上一行
? ? # instr(reverse(txt),',') 取得最后一个逗号的位置
? ? # sleep 1 为缓解负载压力
? ??
? ? mysql -u root -p123456 -S /data/18251/mysqldata/mysql.sock -Dtest -e "${line}"?
? ? mysql -u root -p123456 -S /data/18251/mysqldata/mysql.sock -Dtest -e "
?? ?insert into t1 (sdate,userid,qu_title,qu_item)
? ? select sdate,userid,qu_title,qu_item?
? ? ? from (select '$sdate' sdate,substring_index(txt,',',1) userid,substr(txt,instr(txt,',')+1,char_length(txt) - instr(reverse(txt),',')-instr(txt,',')) qu_title,substring_index(txt,',',-1) qu_item from t_question) t ?where userid >= 1000000;
? ? insert into t1 (sdate,userid,qu_title,qu_item)
? ? select '$sdate' sdate,substring_index(txt,',',1) userid,substr(txt,instr(txt,',')+1,char_length(txt) - instr(reverse(txt),',')-instr(txt,',')) qu_title,substring_index(txt,',',-1) qu_item?
? ? ? from (select concat(lag_txt,userid) txt from (select txt,substring_index(txt,',',1) userid,lag(txt,1) over () lag_txt from t_question) t where userid < 1000000) t;
? ? commit;
?? ?"?
? ? sleep 1;
done

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:25:14  更:2022-05-05 11:28:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:57:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码