使用Python创建faker实例生成csv大数据测试文件并导入Hive数仓

news2024/11/19 16:29:48

文章目录

  • 一、Python生成数据
    • 1.1 代码说明
    • 1.2 代码参考
  • 二、数据迁移
    • 2.1 从本机上传至服务器
    • 2.2 检查源数据格式
    • 2.3 检查大小并上传至HDFS
  • 三、beeline建表
    • 3.1 创建测试表并导入测试数据
    • 3.2 建表显示内容
  • 四、csv文件首行列名的处理
    • 4.1 创建新的表
    • 4.2 将旧表过滤首行插入新表

一、Python生成数据

1.1 代码说明

这段Python代码用于生成模拟的个人信息数据,并将数据保存为CSV文件。

  1. 导入必要的模块:

    • csv:用于处理CSV文件的模块。
    • random:用于生成随机数。
    • faker:用于生成模拟数据的库。
  2. 定义生成数据所需的基本信息:

    • file_base_path:生成的CSV文件的基本路径。
    • rows_per_file:每个CSV文件中包含的行数。
    • num_rows:要生成的总行数。
    • fake:创建faker.Faker()实例,用于生成模拟数据。
  3. 定义模拟数据的字典:

    • nationalities:包含国籍编码和对应的国家。
    • regions:包含区域编码和对应的区域名称。
    • source_codes:包含一组源代码。
  4. 使用计数器 row_counter 来跟踪生成的行数。

  5. 使用循环生成多个CSV文件,每个文件包含 rows_per_file 行数据。

  6. 在每个文件中,生成随机的个人信息数据,并将其写入CSV文件。

  7. 数据生成的过程中,每10000行数据打印一次进度。

  8. 所有数据生成后,打印生成的总行数。

这段代码使用Faker库生成模拟的个人信息数据,每个CSV文件包含一定数量的行数据,数据字段包括 Rowkey, Name, Age, Email, Address, IDNumber, PhoneNumber, Nationality, Region, SourceCode

1.2 代码参考

import csv
import random
import faker

# 文件基本路径
file_base_path = './output/personal_info_extended'
# 每个文件的行数
rows_per_file = 10000
# 总行数
num_rows = 10000000

# 创建Faker实例
fake = faker.Faker()

# 定义数据字典
nationalities = {
    1: 'US',
    2: 'CA',
    3: 'UK',
    4: 'AU',
    5: 'FR',
    6: 'DE',
    7: 'JP',
}

regions = {
    1: 'North',
    2: 'South',
    3: 'East',
    4: 'West',
    5: 'Central',
}

source_codes = ['A123', 'B456', 'C789', 'D101', 'E202']

# 计数器用于跟踪生成的行数
row_counter = 0

# 循环生成数据文件
for file_number in range(1, num_rows // rows_per_file + 1):
    file_path = f"{file_base_path}_{file_number}.csv"

    # 打开CSV文件以写入数据
    with open(file_path, 'w', newline='') as csvfile:
        csv_writer = csv.writer(csvfile)

        # 写入CSV文件的标题行
        if row_counter == 0:
            csv_writer.writerow(['Rowkey', 'Name', 'Age', 'Email', 'Address', 'IDNumber', 'PhoneNumber', 'Nationality', 'Region', 'SourceCode'])

        # 生成并写入指定行数的扩展的个人信息模拟数据
        for _ in range(rows_per_file):
            name = fake.name()
            age = random.randint(18, 99)
            email = fake.email()
            address = fake.address().replace('\n', ' ') // 替换掉地址中的换行,保持数据生成为一行
            id_number = fake.ssn()
            phone_number = fake.phone_number()
            nationality_code = random.randint(1, len(nationalities))
            nationality = nationalities[nationality_code]
            region_code = random.randint(1, len(regions))
            region = regions[region_code]
            source_code = random.choice(source_codes)

            data_row = [row_counter + 1, name, age, email, address, id_number, phone_number, nationality, region, source_code]
            csv_writer.writerow(data_row)

            row_counter += 1

    print(f'已生成 {row_counter} 行数据')

print(f'{num_rows} 行扩展的个人信息模拟数据已生成')

在这里插入图片描述

二、数据迁移

2.1 从本机上传至服务器

[root@hadoop10 personInfo]# pwd
/opt/data/personInfo
[root@hadoop10 personInfo]# ls -l| wc -l
215
[root@hadoop10 personInfo]# wc -l *
...
    10000 personal_info_extended_98.csv
    10000 personal_info_extended_99.csv
    10000 personal_info_extended_9.csv
  2131609 总用量

通过命令显示我们使用了生成的215个csv文件,现在已经上传到了/opt/data/personInfo目录下。

2.2 检查源数据格式

[root@hadoop10 personInfo]# head personal_info_extended_1.csv
Rowkey,Name,Age,Email,Address,IDNumber,PhoneNumber,Nationality,Region,SourceCode
1,Hayley Jimenez,58,garrisonalicia@harris.com,"92845 Davis Circles Apt. 198 East Jerryshire, NV 35424",657-35-2900,(141)053-9917,DE,North,C789
2,Amy Johnson,23,samuelrivera@hall.com,"119 Manning Rapids Suite 557 New Randyburgh, MN 58113",477-76-9570,+1-250-531-6115,UK,North,D101
3,Sara Harper,31,gsandoval@hotmail.com,"98447 Robinson Dale Garzatown, ME 35917",254-77-4980,7958192189,AU,East,A123
4,Alicia Wang,53,kellyreed@evans.com,"531 Lucas Vista New Laura, MO 62148",606-19-1971,001-295-093-9174x819,DE,West,C789
5,Lauren Rodriguez,71,rebeccasaunders@yahoo.com,"060 Gomez Ports Suite 355 Lake Aarontown, CO 38284",186-61-7463,8458236624,DE,East,E202
6,Juan Harris,98,davidsonjohn@hines.com,"50325 Alvarez Forge Apt. 800 New Ericchester, AL 16131",529-53-1492,+1-302-675-5810,CA,East,B456
7,Stephanie Price,90,sroberts@becker.com,"9668 Erik Inlet Port Joshua, MO 62524",303-11-9577,628.011.4670,UK,East,C789
8,Nicole Parker,61,tmcneil@rose-rodriguez.com,"485 Elliott Branch Scottshire, NJ 03885",473-55-5636,001-625-925-3712x952,FR,West,A123
9,Joel Young,54,john03@hotmail.com,"9413 Houston Flats Apt. 095 West Peggy, MD 56240",547-31-2815,920.606.0727x27740,JP,Central,E202

使用head命令查看文件的头,发现了首行字段,我们可以通过首行字段编写建表语句。

2.3 检查大小并上传至HDFS

[root@hadoop10 data]# du -h
282M    ./personInfo
282M    .
[root@hadoop10 data]# hdfs dfs -put /opt/data/personInfo /testdir/

[root@hadoop10 data]# hdfs dfs -du -h /testdir/
281.4 M  281.4 M  /testdir/personInfo

linux本地文件占用282M,上传至HDFS集群/testdir/目录后占用281.4M.

三、beeline建表

3.1 创建测试表并导入测试数据

CREATE TABLE personal_info (
    Rowkey STRING,
    Name STRING,
    Age STRING,
    Email STRING,
    Address STRING,
    IDNumber STRING,
    PhoneNumber STRING,
    Nationality STRING,
    Region STRING,
    SourceCode STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

LOAD DATA INPATH '/testdir/personInfo/*.csv' INTO TABLE personal_info;

如果csv文件的每一行都有同样的列名,需要在建表语句最后添加以下代码:TBLPROPERTIES ("skip.header.line.count"="1"),将首行跳过。

本案例由于使用python生成文件,只有第一个csv文件有列名,其余csv没有列名,我们稍后单独处理这一个首行。

3.2 建表显示内容

0: jdbc:hive2://hadoop10:10000> CREATE TABLE personal_info (
. . . . . . . . . . . . . . . >     Rowkey STRING,
. . . . . . . . . . . . . . . >     Name STRING,
. . . . . . . . . . . . . . . >     Age STRING,
. . . . . . . . . . . . . . . >     Email STRING,
. . . . . . . . . . . . . . . >     Address STRING,
. . . . . . . . . . . . . . . >     IDNumber STRING,
. . . . . . . . . . . . . . . >     PhoneNumber STRING,
. . . . . . . . . . . . . . . >     Nationality STRING,
. . . . . . . . . . . . . . . >     Region STRING,
. . . . . . . . . . . . . . . >     SourceCode STRING
. . . . . . . . . . . . . . . > )
. . . . . . . . . . . . . . . > ROW FORMAT DELIMITED
. . . . . . . . . . . . . . . > FIELDS TERMINATED BY ','
. . . . . . . . . . . . . . . > STORED AS TEXTFILE;
No rows affected (0.147 seconds)
0: jdbc:hive2://hadoop10:10000> LOAD DATA INPATH '/testdir/personInfo/*.csv' INTO TABLE personal_info;
No rows affected (2.053 seconds)
0: jdbc:hive2://hadoop10:10000> select * from personal_info limit 5;
+-----------------------+---------------------+--------------------+----------------------------+------------------------------------------------+-------------------------+----------------------------+----------------------------+-----------------------+---------------------------+
| personal_info.rowkey  | personal_info.name  | personal_info.age  |    personal_info.email     |             personal_info.address              | personal_info.idnumber  | personal_info.phonenumber  | personal_info.nationality  | personal_info.region  | personal_info.sourcecode  |
+-----------------------+---------------------+--------------------+----------------------------+------------------------------------------------+-------------------------+----------------------------+----------------------------+-----------------------+---------------------------+
| Rowkey                | Name                | Age                | Email                      | Address                                        | IDNumber                | PhoneNumber                | Nationality                | Region                | SourceCode                |
| 1                     | Hayley Jimenez      | 58                 | garrisonalicia@harris.com  | "92845 Davis Circles Apt. 198 East Jerryshire  |  NV 35424"              | 657-35-2900                | (141)053-9917              | DE                    | North                     |
| 2                     | Amy Johnson         | 23                 | samuelrivera@hall.com      | "119 Manning Rapids Suite 557 New Randyburgh   |  MN 58113"              | 477-76-9570                | +1-250-531-6115            | UK                    | North                     |
| 3                     | Sara Harper         | 31                 | gsandoval@hotmail.com      | "98447 Robinson Dale Garzatown                 |  ME 35917"              | 254-77-4980                | 7958192189                 | AU                    | East                      |
| 4                     | Alicia Wang         | 53                 | kellyreed@evans.com        | "531 Lucas Vista New Laura                     |  MO 62148"              | 606-19-1971                | 001-295-093-9174x819       | DE                    | West                      |
+-----------------------+---------------------+--------------------+----------------------------+------------------------------------------------+-------------------------+----------------------------+----------------------------+-----------------------+---------------------------+
5 rows selected (0.52 seconds)

四、csv文件首行列名的处理

4.1 创建新的表

解决思路是通过将整表的数据查询出,插入到另一个新表中,而后删除旧的表,该方法如果在生产环境中使用应考虑机器性能和存储情况。

CREATE TABLE pinfo (
    Rowkey STRING,
    Name STRING,
    Age STRING,
    Email STRING,
    Address STRING,
    IDNumber STRING,
    PhoneNumber STRING,
    Nationality STRING,
    Region STRING,
    SourceCode STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

查询旧表中的行数。

0: jdbc:hive2://hadoop10:10000> select count(*) from personal_info;
+----------+
|   _c0    |
+----------+
| 2131609  |
+----------+
1 row selected (45.762 seconds)

4.2 将旧表过滤首行插入新表

INSERT OVERWRITE TABLE pinfo
SELECT
    t.Rowkey,
    t.Name,
    t.Age,
    t.Email,
    t.Address,
    t.IDNumber,
    t.PhoneNumber,
    t.Nationality,
    t.Region,
    t.SourceCode
FROM (
    SELECT
        Rowkey,
        Name,
        Age,
        Email,
        Address,
        IDNumber,
        PhoneNumber,
        Nationality,
        Region,
        SourceCode
    FROM personal_info
) t
WHERE t.Name != 'Name';

0: jdbc:hive2://hadoop10:10000> select * from pinfo limit 5;
+---------------+-------------------+------------+----------------------------+------------------------------------------------+-----------------+--------------------+-----------------------+---------------+-------------------+
| pinfo.rowkey  |    pinfo.name     | pinfo.age  |        pinfo.email         |                 pinfo.address                  | pinfo.idnumber  | pinfo.phonenumber  |   pinfo.nationality   | pinfo.region  | pinfo.sourcecode  |
+---------------+-------------------+------------+----------------------------+------------------------------------------------+-----------------+--------------------+-----------------------+---------------+-------------------+
| 1             | Hayley Jimenez    | 58         | garrisonalicia@harris.com  | "92845 Davis Circles Apt. 198 East Jerryshire  |  NV 35424"      | 657-35-2900        | (141)053-9917         | DE            | North             |
| 2             | Amy Johnson       | 23         | samuelrivera@hall.com      | "119 Manning Rapids Suite 557 New Randyburgh   |  MN 58113"      | 477-76-9570        | +1-250-531-6115       | UK            | North             |
| 3             | Sara Harper       | 31         | gsandoval@hotmail.com      | "98447 Robinson Dale Garzatown                 |  ME 35917"      | 254-77-4980        | 7958192189            | AU            | East              |
| 4             | Alicia Wang       | 53         | kellyreed@evans.com        | "531 Lucas Vista New Laura                     |  MO 62148"      | 606-19-1971        | 001-295-093-9174x819  | DE            | West              |
| 5             | Lauren Rodriguez  | 71         | rebeccasaunders@yahoo.com  | "060 Gomez Ports Suite 355 Lake Aarontown      |  CO 38284"      | 186-61-7463        | 8458236624            | DE            | East              |
+---------------+-------------------+------------+----------------------------+------------------------------------------------+-----------------+--------------------+-----------------------+---------------+-------------------+
5 rows selected (0.365 seconds)
0: jdbc:hive2://hadoop10:10000>

在这里插入图片描述
在yarn中查看新表插入的进度。

最后新表的查询结果显示比旧表少1行即为插入处理完成。

0: jdbc:hive2://hadoop10:10000> select count(*) from pinfo;
+----------+
|   _c0    |
+----------+
| 2131608  |
+----------+
1 row selected (0.291 seconds)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1095070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qml基础语法

文章目录 基础语法例子 属性例子 核心元素元素item RectangleText例子 Image例子 MouseArea例子Component(组件)例子简单变换例子 定位器ColumnRowGridFlowRepeater 布局InputKeys 基础语法 QML是一种用于描述对象如何相互关联的声明式语言。  QtQuick是…

qt-C++笔记之按行读取文件并切换复选框打印复选框拼接出的字符串

qt-C笔记之按行读取文件并切换复选框打印复选框拼接出的字符串 code review! 文章目录 qt-C笔记之按行读取文件并切换复选框打印复选框拼接出的字符串1.运行2.文件结构3.main.cc4.main.pro5.a.txt6.b.txt 1.运行 2.文件结构 3.main.cc 代码 #include <QApplication> #…

简易通讯录Promax

前言&#xff1a;哈喽小伙伴们&#xff0c;我们在前边的文章中已经介绍过了如何用C语言实现一个简易的通讯录&#xff0c;但是我们这个通讯录存在两个问题&#xff1a; 一是通讯录的大小不能自由变化&#xff1b;二是通讯录的信息在程序退出之后就没有了&#xff0c;不能保存。…

【C语言】进阶——文件操作

目录 前言 1.什么是文件 程序文件&#xff1a; 数据文件&#xff1a; 文件名&#xff1a; 2.文件的打开和关闭 2.1文件指针 2.2文件指针使用 2.3文件的打开和关闭 2.4 文件的使用方式 2.5文件的顺序读写 ✌字符输出函数fputc ✌字符输入函数fgetc ✌文本行输…

【重拾C语言】十三、动态数据组织(一)动态变量(malloc、calloc、realloc、free)

目录 前言 十三、动态数据组织 13.1 动态数据组织 13.2 动态变量 malloc函数 calloc函数 realloc函数 free函数 程序实例 前言 C语言中的动态数据组织是指在程序运行时根据需要动态地分配内存空间来存储数据。这允许程序在运行时根据实际需求来创建、修改和释放数据结…

【数字IC设计】VCS门级网表仿真

本文参考自文章。 除了RTL仿真以外&#xff0c;在IC设计过程中还会进行门级网表的仿真。当设计代码功能仿真通过之后&#xff0c;我们便使用Design Compiler工具对其进行逻辑综合&#xff0c;将RTL代码转化为由与、或、非等门电路和触发器组成的电路&#xff0c;称为门级网表(n…

25栈和队列-理解栈和队列

目录 LeetCode之路——232. 用栈实现队列 分析&#xff1a; LeetCode之路——225. 用队列实现栈 分析&#xff1a; 栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;是两种基本的数据结构&#xff0c;它们在计算机科学中用于不同的目的。以下是它们的定…

【传输层协议】UDP/TCP结构特点与原理(详解)

文章目录 1. UDP1.1 UDP结构1.2 UDP特点1. 无连接2. 不可靠3. 面向数据报4. 缓冲区5. 大小受限6. 无序性 2. TCP2.1 TCP结构2.2 TCP特点1. 有连接2. 可靠性3. 面向字节流4. 拥塞控制5. 头部开销 2.3 TCP原理1. 确认应答&#xff08;安全机制&#xff09;2. 超时重传&#xff08…

Ceph分布式存储的简单介绍与Ceph集群的部署搭建

文章目录 1. 存储的概述1.1 单机存储设备1.1.1 DAS&#xff08;直接附加存储&#xff09;1.1.2 NAS&#xff08;网络附加存储&#xff09;1.1.3 SAN&#xff08;存储区域网络&#xff09; 1.2 单机存储的缺陷1.3 分布式存储&#xff08;软件定义的存储 SDS&#xff09;1.4 分布…

【计算机网络笔记】数据交换之报文交换和分组交换

系列文章目录报文交换分组交换存储-转发报文交换 vs 分组交换总结 系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 报文交换 报文&#xff1a;源&#xff08;应用&#xff09;发送的信息整体。比如一个文件、一…

Transformer 中 Positional Encoding 实现

参考博文&#xff1a; https://www.cnblogs.com/nickchen121/p/16470736.html 解决问题 位置编码的主要目的是确保模型能够理解序列中的元素之间的相对位置和顺序&#xff0c;从而更好地捕捉到语义信息。在Transformer模型中&#xff0c;位置编码通常与词嵌入&#xff08;w…

前端小知识之【浏览器内核】

目录 &#x1f31f;前言&#x1f31f;PC端浏览器内核&#x1f31f;Trident内核&#x1f31f;Gecko内核&#x1f31f;WebKit内核(Chromium)&#x1f31f;Blink内核 &#x1f31f;移动端浏览器内核&#x1f31f;应用&#x1f31f;写在最后 &#x1f31f;前言 通常所谓的浏览器内…

docker安装nessus

注册地址:https://zh-tw.tenable.com/products/nessus/nessus-essentials 临时邮箱:http://24mail.chacuo.net/ 帮助文档:https://docs.tenable.com/nessus/Content/DeployNessusDocker.htmdocker pull tenableofficial/nessusdocker run --name "my-nessus" -d -p 8…

【Go入门】编程语言比较:Golang VS Python

Golang&#xff1a;最佳人工智能语言&#xff0c;性能优于 Python 本节是学习go的引入&#xff0c;为了了解Python与go编程语言间比较。后续会完成相关课程&#xff0c;并分享笔记。 如今&#xff0c;世界各地有数百万用户使用 Golang 作为机器学习和人工智能的编程语言。 最好…

算法通过村第十四关-堆|白银笔记|经典问题

文章目录 前言在数组中寻找第K大的元素堆排序原理合并K个排序链表总结 前言 提示&#xff1a;想要从讨厌的地方飞出来&#xff0c;就得有藏起来的翅膀。 --三岛由纪夫《萨德侯爵夫人》 这里我们主要看一下经典的题目&#xff0c;这三个题目来说都是堆的热点问题。重点再理解处理…

Qt不能安装自己想要的版本,如Qt 5.15.2

使用在线安装工具安装Qt5.15.2时&#xff0c;发现没有Qt 5的相关版本&#xff0c;只有Qt 6的版本&#xff0c;这时选择右边的Archive&#xff0c;再点击筛选&#xff0c;这时就会出现之前的Qt版本。

vscode插件路径转移C盘之外盘

改变vscode系统路径 最近C盘路径不够了&#xff0c;网上的工具使用没那么精细&#xff0c;还不如自己手动看每个文件夹大小。在整理过长遇到vscode插件路径转移&#xff0c;方法如下&#xff1a; 桌面图标右键点击属性 改变–extensions-dir后面参数就可以了。

Web3 整理React项目 导入Web3 并获取区块链信息

上文 WEB3 创建React前端Dapp环境并整合solidity项目&#xff0c;融合项目结构便捷前端拿取合约 Abi 我们用react 创建了一个 dapp 项目 并将前后端代码做了个整合 那么 我们就来好好整理一下 我们的前端react的项目结构 我们在 src 目录下创建一个 components 用来存放我们的…

Python学习----Day07

函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。函数能提高应用的模块性&#xff0c;和代码的重复利用率。你已经知道Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0c;这被叫做…

C++ 程序员入门需要多久,怎样才能学好?

文章目录 C学习方案有哪些推荐的在线教程或学习资源可以帮助我学习C编程&#xff1f;你能给我一些关于C内存管理的进阶学习资源吗&#xff1f; AI解答 C学习方案 C是一种功能强大且广泛应用的编程语言&#xff0c;作为一个初学者&#xff0c;学习C需要一定的时间和努力。学习…