机器学习:软件工程方法与实现
上QQ阅读APP看书,第一时间看更新

4.1.2 如何取样X

1.2.2节提到机器学习中的“经验”部分,包含数据获取这一项活动,接下来我们将列举几种常见的数据获取方法,供读者参考。当一个项目中有来自不同数据源的数据时,最终需要将这些独立的数据文件整合到单一数据中。

在取样之前,建议对原始数据进行一定的分析和校验,重点考虑如下几点。

·数据正确性:数据的基本要求,需真实客观。

·数据一致性:数据的原始定义一致。例如数据保持单位一致性,中途未发生变更。

·数据合法性:数据获取方式应合法,否则数据极有可能出现后续不可用的情况,导致模型失效。例如国家禁止运营商贩卖数据,那么使用这些数据的模型将不可用。

·数据有效性:尤其是在具有时间属性的场景中,要求每次获取到的信息是实时或最近的有效信息。

我们假设在导出数据之前,样本已经在数据存储平台准备好,甚至已完成了部分数据清洗和处理工作。下文数据导出示例包括:传统关系型数据库(MySQL)、非关系型数据库(Mongo)、大数据平台(Hive、Spark、Impala),主要示例仅仅将数据导出到本地,但是以脚本的形式而非命令行形式,这样便于制定Job任务和管理,形成工程思维。

1.MySQL导数示例

一般数据源存储在大数据平台或直接使用代码连接数据库分析,这里仅做演示。


# mysql_export.sql
SELECT * INTO OUTFILE '/tmp/export_mysql.csv' COLUMNS TERMINATED BY ',' LINES TERMINATED BY '\r\n' FROM information_schema.CHARACTER_SETS;

使用如下命令执行:


mysql -uroot -p < mysql_export.sql

2.Mongo导数示例

首先编写待导出的字段:


#cat filelds.txt 
id
date
feature_1
feature_2

导数脚本,请自定义查询条件CONDITION。


## export.sh
#!/bin/bash
HOST=xxx
PORT=xxx
USER=xxx
PASS='xxx'
DB_NAME=xxx
TB_NAME=xxx
CSV_FILE=$1
FIELDS_FILE=filelds.txt
CONDITION='{ $and: [{"timestamp": { $gte: 1555516800 } }, {"timestamp": { $lt: 1556207999 } } ] }'
/usr/bin/mongoexport -h ${HOST} --port ${PORT}\
        -d ${DB_NAME} -c ${TB_NAME}         \
        -u ${USER} -p ${PASS}               \
        --readPreference=nearest            \
        --type=csv -q "${CONDITION}"        \
        --fieldFile=$FIELDS_FILE -o $CSV_FILE

命令行执行即可:


bash export.sh your_features.csv

3.PySpark导数示例

使用PySpark导出大数据集群数据:


# spark_export.py
from pyspark import SparkContext, SparkConf
from pyspark.sql import HiveContext
conf = SparkConf().setAppName("pyspark_export_csv")
sc = SparkContext(conf=conf)
hiveCtx = HiveContext(sc)

sql = '''select * from your_db.your_table'''
spk_df = hiveCtx.sql(sql)
df = spk_df.toPandas()
df.to_csv('spark_exported.csv', encoding='utf-8')

使用如下命令提交:


spark-submit --master yarn-client spark_export.py

另外,更多详情可参考https://github.com/seahboonsiew/pyspark-csv

4.Hive导数示例

在命令行中输入如下命令,或将这些命令写入文件,例如export.sql,然后执行hive-f export.sql即可。


insert overwrite local directory '/tmp/hive_export'
row format delimited
fields terminated by ',' # 默认分隔符为8进制1 \x01
select * from your_db.your_table;

5.Impala导数示例

在命令行执行即可。


# 如果有权限认证,请加入认证参数
impala-shell -i your_impala_node -f your.sql -B --output_delimiter="," --print_header -o your_data.csv