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