数据清洗第八章—例子

6 篇文章 0 订阅
6 篇文章 0 订阅

目录

一、加载日期数据至日期维度表

1、打开kettle工具,创建load_dim_date转换

2、配置“生成记录”控件

3、配置“增加序列”控件

4、配置“JavaScript代码”控件

5、配置“表输出”控件

6、运行转换load_dim_date 

7、查看维度表dim_date中的数据

二、 加载时间数据至时间维度表

1、打开kettle工具,创建load_dim_time转换

2、配置“生成记录”控件

3、配置“增加序列”控件

4、 配置“JavaScript代码”控件

5、配置“生成记录2”控件

​6、配置“增加序列2”控件 

7、配置“生成记录3”控件

​8、配置“增加序列3”控件

9、配置“JavaScript代码2”控件

10、配置“表输出”控件

11、运行转换load_dim_time

​12、查看维度表dim_time中的数据

 三、加载员工数据至员工维度表

1、打开kettle工具,创建load_dim_staff转换

2、配置“表输入”控件

3、配置“表输入2”控件

4、配置“字段选择”控件

5、配置“值映射”控件

6、配置“维度查询/更新”控件

​7、运行转换load_dim_staff


一、加载日期数据至日期维度表

1、打开kettle工具,创建load_dim_date转换

2、配置“生成记录”控件

双击“生成记录”控件,进入“生成记录”界面,在“限制”处添加生成的日期,默认为10,这里改为3650,即生成10年的日期(10*365);在“字段”框添加字段language、country_code、initial_date,对生成的日期进行初始化,然后单击“确定”按钮,完成配置,如下图所示:

 3、配置“增加序列”控件

在该控件中“值的名称”处将valuename改为DaySequence,即增加一列日期字段,用于改变“生成记录”控件生成的日期,再单击“确定”按钮完成配置,如下图所示:

4、配置“JavaScript代码”控件

在该控件中勾选“兼容模式?”复选框,使得“JavaScript代码”控件的兼容性更强,并且在Java Script代码框中编写代码,再单击“确定”按钮完成配置,如下图 所示:

//生成locale、calendar
var locale=new java.util.Locale(language.getString(),country_code.getString());
var calendar=new java.util.GregorianCalendar(locale);
//设置时间、指定日历为当前日期
calendar.setTime(initial_date.getDate());
calendar.add(calendar.DAY_OF_MONTH,DaySequence.getInteger()-1);
//获取日期
var date=new java.util.Date(calendar.getTimeInMillis());
//生成短日期、中日期、长日期、全日期
var date_short=java.text.DateFormat.getDateInstance
						(java.text.DateFormat.SHORT,locale).format(date);
var date_medium=java.text.DateFormat.getDateInstance
						(java.text.DateFormat.MEDIUM,locale).format(date);
var date_long=java.text.DateFormat.getDateInstance
						(java.text.DateFormat.LONG,locale).format(date);
var date_full=java.text.DateFormat.getDateInstance
						(java.text.DateFormat.FULL,locale).format(date);
//简单格式化
var simpleDateFormat=java.text.SimpleDateFormat("D",locale);
//某天在年的第几天、某天在月的第几天
var day_in_year=simpleDateFormat.format(date);
simpleDateFormat.applyPattern("d");
var day_in_month=simpleDateFormat.format(date);
simpleDateFormat.applyPattern("EEEE");
//星期的名称、星期的缩写
var day_name=simpleDateFormat.format(date);
simpleDateFormat.applyPattern("E");
var day_abbreviation=simpleDateFormat.format(date);
simpleDateFormat.applyPattern("WW");
//一年的第几周、一月的第几周
var week_in_year=simpleDateFormat.format(date);
simpleDateFormat.applyPattern("W");
var week_in_month=simpleDateFormat.format(date);
simpleDateFormat.applyPattern("MM");
//设置月份、即月份的名称、月份的缩写
var month_number=simpleDateFormat.format(date);
simpleDateFormat.applyPattern("MMMM");
var month_name=simpleDateFormat.format(date);
simpleDateFormat.applyPattern("MMM");
var month_abbreviation=simpleDateFormat.format(date);
simpleDateFormat.applyPattern("yy");
//设置年份,即年的格式为两位、四位
var year2=simpleDateFormat.format(date);
simpleDateFormat.applyPattern("yyyy");
var year4=simpleDateFormat.format(date);
//设置季度
var quarter_name="Q";
var quarter_number;
switch(parseInt(month_number)){
		case 1:case 2:case 3:quarter_number="1";break;
		case 4:case 5:case 6:quarter_number="2";break;
		case 7:case 8:case 9:quarter_number="3";break;
		case 10:case 11:case 12:quarter_number="4";break;
}
quarter_name+=quarter_number;
//定义常量
var yes="yes";
var no="no";
//获取周的第一天
var first_day_of_week=calendar.getFirstDayOfWeek();
var day_of_week=java.util.Calendar.DAY_OF_WEEK;
//判断是否为周的第一天
var is_first_day_in_week;
if(first_day_of_week==calendar.get(day_of_week)){
	is_first_day_in_week=yes;
}else{
	is_first_day_in_week=no;
}
//获取日历的下一天
calendar.add(calendar.DAY_OF_MONTH,1);
//获取下一天
var next_day=new java.util.Date(calendar.getTimeInMillis());
//判断是否为周的最后一天、是否为月的第一天、是否为月的最后一天
var is_last_day_in_week;
if(first_day_of_week==calendar.get(day_of_week)){
	is_last_day_in_week=yes;
}else{
	is_last_day_in_week=no;
}
var is_first_day_in_month;
if(day_in_month==1){
	is_first_day_in_month=yes;
}else{
	is_first_day_in_month=no;
}
var is_last_day_in_month;
if(java.text.SimpleDateFormat("d",locale).format(next_day)==1){
	is_last_day_in_month=yes;
}else{
	is_last_day_in_month=no;
}
//设置年_季度、年_月份、年_月的缩写
var year_quarter=year4+"-"+quarter_name;
var year_month_number=year4+"-"+month_number;
var year_month_abbreviation=year4+"-"+month_abbreviation;
//生成日期代理键(唯一键)
var date_key=year4+month_number+(day_in_month<10?"0":"")+day_in_month;	

单击“获取变量”按钮,将代码中定义的变量添加至字段框中,注意此处“data”字段的类型为“Date”类型,如下图所示:

5、配置“表输出”控件

首先连接数据库,单击右侧“浏览”按钮选中目标表为“dim_date”,再勾选“指定数据库字段”复选框,用于将维度表字段与JavaScript控件中的变量字段进行匹配,如下图所示:

 

单击“数据库字段”选项卡,弹出“数据库字段”选项卡界面,在该界面下单击“输入字段映射”按钮,弹出“映射匹配”对话框,依次选中“源字段”中的字段和“目标字段”中的字段进行匹配,如下图所示:

 

6、运行转换load_dim_date 

 7、查看维度表dim_date中的数据

二、 加载时间数据至时间维度表

1、打开kettle工具,创建load_dim_time转换

 2、配置“生成记录”控件

双击进入该控件,在“限制”后的文本框添加24表示生成24条数据;在“字段”框添加生成字段的名称,字段类型以及默认值为0(后面生成记录2和生成记录3同样的原理,分别表示时:分:秒),如下图所示:

3、配置“增加序列”控件

 

4、 配置“JavaScript代码”控件

在该控件中勾选“兼容模式?”,然后在JavaScript代码框中编写如下代码:

//生成12小时格式
var hours12=hours24.getInteger()%12;
//生成AM,PM格式
var am_pm=hours24.getInteger()>12?"PM":"AM";

编写完成后点击“获取变量”按钮,将代码中定义的变量添加至字段框,如下图所示:

5、配置“生成记录2”控件

 6、配置“增加序列2”控件 

7、配置“生成记录3”控件

 8、配置“增加序列3”控件

9、配置“JavaScript代码2”控件

勾选“兼容模式?”复选框,在JavaScript代码框中写入代码:

//生成time
var time=hours24.getInteger()+":"
		+minutes.getInteger()+":"
		+seconds.getInteger();
//time_key
var time_key=(hours24.getInteger()<10?"0":"")
			+hours24.getInteger()+(minutes.getInteger()<10?"0":"")
			+minutes.getInteger()+(seconds.getInteger()<10?"0":"")
			+seconds.getInteger();

 编写完成后点击“获取变量”按钮,将代码中定义的变量添加至字段框,如下图所示:

10、配置“表输出”控件

首先连接数据库,单击右侧“浏览”按钮选中目标表为“dim_time”,再勾选“指定数据库字段”复选框,用于将维度表dim_time中字段与JavaScript控件中的变量字段进行匹配,如下图所示:

 单击“数据库字段”选项卡,弹出“数据库字段”选项卡界面,在该界面下单击“输入字段映射”按钮,弹出“映射匹配”对话框,依次选中“源字段”中的字段和“目标字段”中的字段进行匹配,如下图所示:

11、运行转换load_dim_time

 12、查看维度表dim_time中的数据

 

 三、加载员工数据至员工维度表

1、打开kettle工具,创建load_dim_staff转换

2、配置“表输入”控件

首先配置数据库连接,完成后单击“确定”按钮完成配置;然后在SQL框中编写如下SQL语句:

select
coalesce(max(staff_last_update),"1970-01-01 00:00:00")
max_dim_staff_last_update
from dim_staff

 编写完成后预览如下:

3、配置“表输入2”控件

首先配置数据库连接,完成后单击“确定”按钮完成配置;然后在SQL框中编写如下SQL语句:

select
'staff_id',
'first_name',
'last_name',
'address_id',
'picture',
'email',
'stroe_id',
'active',
'username',
'password',
'last_update'
from staff where last_update > ?

从步骤插入数据选择“表输入”,编写完成预览如下:

4、配置“字段选择”控件

在该界面进入“选择/改名值”,在“元数据”选项卡的“需要改变元数据的字段”处添加字段active,由于维度表dim_staff中字段staff_active的数据类型为char类型,因此要将数据表staff中字段active的数据类型改为String,如下图所示

5、配置“值映射”控件

在该控件中将“使用的字段名”后的下拉列表中选择字段active;在“字段值”框中添加源值和目标值,这里将Y替换成Yes,将N替换成No,如下图所示

6、配置“维度查询/更新”控件

该控件中先配置数据库,完成后选择输出的目标表,即维度表dim_staff;在“关键字”选项卡处添加关键字字段staff_id,在“字段”选项卡处添加查询/更新字段;在“代理关键字段”后的下拉列表中选择staff_key,并指定“创建代理键”为使用自增字段;在“Version字段”后的下拉列表中选择staff_version_number;在“Stream日期字段”后的下拉列表中选择last_update;在“开始日期字段”后的下拉列表中选择staff_valid_from;在“截止日期字段”后的下拉列表中选择staff_valid_through,如下图所示:

 7、运行转换load_dim_staff

 运行结果显示如下显示

 

### 回答1: 爬取豆瓣Top250电影信息是一个常见的任务,可以通过使用Python编写一个爬虫程序来实现。下面是大致的步骤和思路: 1. 导入所需的库,如requests、BeautifulSoup等。 2. 构造请求头和URL,发送GET请求获取页面内容。 3. 使用BeautifulSoup解析页面内容,使用相关的HTML标签和属性获取电影信息的位置。 4. 遍历获取到的电影信息,提取所需的数据,如电影名称、导演、上映时间、评分等。 5. 创建一个空的列表来存储电影信息。 6. 将提取到的每部电影的信息添加到列表中,可以使用字典来存储每个属性。 7. 将列表的内容写入到CSV文件中,方便进行数据分析和清洗。 8. 对爬取到的数据进行清洗,如处理重复的电影数据、缺失值、异常值等。 9. 对清洗后的数据进行分析和可视化,可以使用Pandas、Matplotlib等库来进行处理和展示。 这只是一个大致的步骤和思路,实际操作可能会有一些细节上的差异。在实际操作中,还需要考虑到反爬措施、请求频率的控制、异常处理等问题。总体来说,使用Python爬取豆瓣Top250电影并进行数据清洗是一个有趣且实用的任务,能帮助我们更好地理解和利用网络上的数据资源。 ### 回答2: 使用Python进行数据爬取是十分常见的操作,而豆瓣top250的数据爬取也是其中一个比较有意义的例子。 首先,使用Python的requests库发送HTTP请求来访问豆瓣top250的页面,并获取页面的HTML源码。 接下来,我们可以使用Python的第三方库BeautifulSoup对获取到的HTML源码进行解析,提取我们所需要的电影数据,例如电影名称、评分、导演等等。 在解析完页面后,我们可能会发现有一些无用的标签或者其他干扰数据,这时候我们需要进行数据清洗数据清洗的目标是去除无关或者错误的数据,以便后续分析。 数据清洗可能包括以下一些操作: 1. 去除HTML标签和无用字符:使用正则表达式或者BeautifulSoup的一些方法,去除HTML标签以及其他干扰字符,只保留我们所需要的数据内容。 2. 异常值处理:检查数据是否有空值、重复值、异常值等,并进行相应的处理。可以将空值填充为缺省值,或者删除重复值等。 3. 数据类型转换:对于数值型数据,可以进行数据类型的转换,例如将评分值转换为浮点型等。 4. 数据排序和筛选:根据需要,可以对数据进行排序或者筛选,例如根据评分进行倒序排序,或者筛选出评分大于某个阈值的电影等。 完成数据清洗后,就可以对清洗后的数据进行进一步分析或保存到文件中。 ### 回答3: 爬取豆瓣Top250电影数据是一个常见的爬虫任务,可以利用Python的网络爬虫库来实现,比如BeautifulSoup和Requests库。以下是一个基本的步骤: 1. 导入相应的库: ```python import requests from bs4 import BeautifulSoup ``` 2. 发送HTTP请求,并获取网页内容: ```python url = 'https://movie.douban.com/top250' response = requests.get(url) html = response.text ``` 3. 使用BeautifulSoup解析网页内容: ```python soup = BeautifulSoup(html, 'html.parser') ``` 4. 根据网页的HTML结构,找到对应的电影信息所在的标签,并提取相关数据: ```python movies = soup.find_all('div', class_='info') for movie in movies: title = movie.find('span', class_='title').text.strip() rating = movie.find('span', class_='rating_num').text.strip() # 进一步清洗其他信息... print(title, rating) ``` 5. 将数据进行清洗和存储: 可以使用Pandas库来处理和清洗数据,并将数据存储为CSV或Excel文件: ```python import pandas as pd data = [] for movie in movies: title = movie.find('span', class_='title').text.strip() rating = movie.find('span', class_='rating_num').text.strip() # 其他信息... data.append({'电影名': title, '评分': rating}) df = pd.DataFrame(data) df.to_csv('top250.csv', index=False) ``` 以上是爬取豆瓣Top250电影数据并进行简单清洗的基本步骤。可以根据具体需求和页面结构进行进一步的代码优化和数据清洗
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值