【Alink】学习&实践-数据源、数据处理、回归、分类、聚类

  • Alink学习链接汇总
  • 1、数据源读取
  • 1.1、读取CSV文件(分批流)
  • 1.2、按行读入文件(分批流)
  • 1.3、读取Kafka数据(流式)
  • (1)部署单节点kafka(使用kafka中的zookeeper)
  • (2)使用Alink流式写入/读取topic数据
  • 解析json数据+sql格式转化
  • 2、数据处理(边用边总结)
  • 3、回归
  • 3.1、线性回归
  • 训练(批式)(例子:批式读取csv----批式训练)
  • 预测(批式和流式)
  • 1.批式预测
  • 2.流式预测
  • 4、分类
  • 5、聚类
  • 数据导出
  • 导出CSV文件
  • 按行导出到文件
  • 导出到Mysql


Alink学习链接汇总

https://www.mianshigee.com/tutorial/Alink-1.0.1/regression.md

https://www.zhihu.com/people/alink_pinshu/posts?page=2

python怎么用读取的表格分组_Alink

以下将采用jupyter进行学习&实践

#导入这一个包就可以了
from pyalink.alink import *
#重置运行环境,并切换到另一个环境
resetEnv()
useLocalEnv(1, flinkHome=None, config=None)

使用以下一条命令来开始使用 pyalink:设置是本地模式还是云环境

  • useLocalEnv(parallelism, flinkHome=None, config=None)
  • useRemoteEnv(host, port, parallelism, flinkHome=None, localIp=“localhost”, config=None)
    Call resetEnv() to reset environment and switch to another. 使用
    resetEnv() 来重置运行环境,并切换到另一个。
能否连接远程 Flink 集群进行计算?

A:通过方法可以连接一个已经启动的 Flink 集群:useRemoteEnv(host, port, parallelism, flinkHome=None, localIp="localhost", shipAlinkAlgoJar=True, config=None)。其中,参数

host 和 port 表示集群的地址;
parallelism 表示执行作业的并行度;
flinkHome 为 flink 的完整路径,默认使用 PyAlink 自带的 flink-1.9.0 路径;
localIp 指定实现 Flink DataStream 的打印预览功能时所需的本机IP地址,需要 Flink 集群能访问。默认为localhost。
shipAlinkAlgoJar 是否将 PyAlink 提供的 Alink 算法包传输给远程集群,如果远程集群已经放置了 Alink 算法包,那么这里可以设为 False,减少数据传输。
Flink-1.10 及以上版本对应的 pyalink 包,还支持类似 pyflink 脚本的远程集群运行方式。

1、数据源读取

例子中所用的文件内容如下:

6.6,3.0,4.4,1.4,Iris-versicolor
5.7,2.9,4.2,1.3,Iris-versicolor
7.7,3.8,6.7,2.2,Iris-virginica
5.1,3.8,1.9,0.4,Iris-setosa
6.2,2.9,4.3,1.3,Iris-versicolor
4.8,3.0,1.4,0.3,Iris-setosa

1.1、读取CSV文件(分批流)


filePath = 'iris.csv'
schema = 'sepal_length double, sepal_width double, petal_length double, petal_width double, category string'
csvSource = CsvSourceBatchOp()\
    .setFilePath(filePath)\
    .setSchemaStr(schema)\
    .setFieldDelimiter(",")
BatchOperator.collectToDataframe(csvSource)

CsvSourceBatchOp() 批运算符
设置set参数:

  • filepath文件路径:可以是从本地、hdfs、http读取
    schemaStr:设置列名和数据类型(这个的数据类型包含很多:https://www.mianshigee.com/tutorial/Alink-1.0.1/cn-csvsourcebatchop.md
    https://zhuanlan.zhihu.com/p/103027854) setFieldDelimiter字段分割符
    skipBlankLine是否忽略空行,默认true
    ignoreFirstLine是否忽略第一行数据,默认false
    rowDelimiter 行分隔符,默认\n

BatchOperator.collectToDataframe(csvSource)
或者写成csvSource.collectToDataframe()
每个批式数据源或批式算子都支持collectToDataframe()方法,数据结果转成Python的DataFrame形式。则可以利用Python丰富的函数库及可视化功能,进行后续的分析和显示

dataframe    python数组和alink批数据源之间转换
(https://zhuanlan.zhihu.com/p/97462270)
import pandas as pd

arr_2D =[
    ['Alice',1],
    ['Bob',2],
    ['Cindy',3]
]

df = pd.DataFrame(arr_2D) 
#使用BatchOperator的fromDataFrame方法,将前面定义好的DataFrame类型变量df作为第一个参数,后面的参数用来定义数据的列名与类型,使用SchemaStr格式,即列名与其类型间用空格分隔,各列定义之间使用逗号进行分隔。
BatchOperator.fromDataframe(df, 'name string, value int').print()

python怎么用读取的表格分组_fink_02


filePath = 'iris.csv'
schema = 'sepal_length double, sepal_width double, petal_length double, petal_width double, category string'
csvSource = CsvSourceStreamOp()\
    .setFilePath(filePath)\
    .setSchemaStr(schema)\
    .setFieldDelimiter(",")
csvSource.print()
#流运算符的执行,是按照一定时间间隔,每次显示若干条
StreamOperator.execute()

print(self, key=None, refreshInterval=0, maxLimit=100)
参数:
key 为一个字符串,表示给对应的 Operator 给定一个索引;不传值时将随机生成。
refreshInterval 表示刷新时间,单位为秒。当这个值大于0时,所显示的表将每隔 refreshInterval 秒刷新,显示前 refreshInterval 的数据;当这个值小于0时,每次有新数据产生,就会在触发显示,所显示的数据项与时间无关。
maxLimit 用于控制显示的数据量,最多显示 maxLimit 条数据。

1.2、按行读入文件(分批流)

分为批流,很明显在执行的时候,感受到批式读取,直接数据展现;流式读取,数据一行一行的呈现。
我们想看一下iris数据,但不想花时间详细定义其数据列名及类型,就可以将其每条数据简单地看作一行文本,使用TextSourceBatchOp,并设置文件路径的参数。


URL = "iris.csv"
data = TextSourceBatchOp().setFilePath(URL).setTextCol("text")
data.print()

python怎么用读取的表格分组_python怎么用读取的表格分组_03


URL = "iris.csv"
data = TextSourceStreamOp().setFilePath(URL).setTextCol("text")
data.print()
StreamOperator.execute()

python怎么用读取的表格分组_机器学习_04

1.3、读取Kafka数据(流式)

(1)部署单节点kafka(使用kafka中的zookeeper)
下载kafka压缩包:
https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/
#上传到云服务器上进行解压:
##解压
tar xvf kafka_2.12-2.3.1.tgz
#以守护进程的模式进行-daemon 启动kafka里面的zookeeper:到kafka解压的包里进行执行:
/bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
#检查一下是否启动成功,QuorumPeerMain表示启动成功
jps
#启动kafka:检查一下启动是否成功,kafka占用端口为9092,zookeeper占用端口2181
/bin/kafka-server-start.sh -daemon  config/server.properties
#常用命令:
#指定zookeeper的地址、端口,副本个数为1(因为我只是单机一个broker) 分区数1 和topic名称test
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

#查看top列表
bin/kafka-topics.sh --list --zookeeper localhost:2181

#启动生产者,--broker-list 指定broker集群的端口 多个用逗号隔开 ,--topic指定具体的topic
 bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test  
#启动消费者,指定broker集群的端口 和具体的topic --from-beginning代表从头开始读取消息
 bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning


#0.9版本之前:
./bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
#0.9版本之后:
./bin/kafka-console-consumer.sh --bootstrap-server 10.1.3.xxx:9092 --topic test --from-beginning

python怎么用读取的表格分组_机器学习_05

(2)使用Alink流式写入/读取topic数据
from pyalink.alink import *
resetEnv()
useLocalEnv(2, flinkHome=None, config=None)
#读取文件中的数据,查看一下数据内容
URL = "iris.csv"
SCHEMA_STR = "sepal_length double, sepal_width double, petal_length double, petal_width double, category string"
data = CsvSourceStreamOp()\
.setFilePath(URL)\
.setSchemaStr(SCHEMA_STR)\
.setFieldDelimiter(",")
data.print()
StreamOperator.execute()

python怎么用读取的表格分组_Alink_06

#将读取到data变量的数据输入到kafka中,相当于kafka的生产者:
sink = KafkaSinkStreamOp()\
.setBootstrapServers("localhost:9092")\
.setDataFormat("json")\
.setTopic("test")

data.link(sink)
StreamOperator.execute()
#消费者:利用KafkaSourceStreamOp()进行读取kafka的topic中的数据:
source = KafkaSourceStreamOp()\
.setBootstrapServers("localhost:9092")\
.setTopic("test")\
.setStartupMode("EARLIEST")\
.setGroupId("test-consumer-group")

source.print(key='kafka_iris', refreshInterval=1, maxLimit=500)

StreamOperator.execute()

python怎么用读取的表格分组_python怎么用读取的表格分组_07

print(self, key=None, refreshInterval=0, maxLimit=100)
参数:
key 为一个字符串,表示给对应的 Operator 给定一个索引;不传值时将随机生成。
refreshInterval 表示刷新时间,单位为秒。当这个值大于0时,所显示的表将每隔 refreshInterval 秒刷新,显示前 refreshInterval 的数据;当这个值小于0时,每次有新数据产生,就会在触发显示,所显示的数据项与时间无关。
maxLimit 用于控制显示的数据量,最多显示 maxLimit 条数据。

参考链接:
https://zhuanlan.zhihu.com/p/101143978
https://www.jianshu.com/p/7b3f8e16ee52
解析json数据+sql格式转化
根据上述程度读取的数据可以看出,message数据是json数据:

我们需要对字符串里面的数据进行提取。
推荐使用JsonValueStreamOp,通过设置需要提取内容的JsonPath,提取出各列数据。

JsonValueStreamOp提取出来的结果都是object类型的。
我们可以使用Flink SQL 的cast方法,在代码实现上,只需在连接JsonValueStreamOp之后,再连接SelectStreamOp并设置其SQL语句参数,

python怎么用读取的表格分组_Alink_08

from pyalink.alink import *
useLocalEnv(1, flinkHome=None, config=None)
source = KafkaSourceStreamOp()\
.setBootstrapServers("localhost:9092")\
.setTopic("ceshi")\
.setStartupMode("EARLIEST")\
.setGroupId("test-consumer-group")
### link方法关联一些解析规则
#source.print()
data = source.link(
    ### 解析成Json数据
    JsonValueStreamOp()\
    .setSelectedCol("message")
    .setReservedCols([])
    .setOutputCols(["sepal_length", "sepal_width", "petal_length",
 "petal_width", "category"])
    .setJsonPath(["$.sepal_length", "$.sepal_width", 
"$.petal_length", "$.petal_width","$.category"])
).link(
     ### 按照sql select格式转化
    SelectStreamOp()\
    .setClause("CAST(sepal_length AS DOUBLE) AS sepal_length, "\
               + "CAST(sepal_width AS DOUBLE) AS sepal_width, "\
               + "CAST(petal_length AS DOUBLE) AS petal_length, "\
               + "CAST(petal_width AS DOUBLE) AS petal_width, category")
)

data.print()
StreamOperator.execute()

python怎么用读取的表格分组_python怎么用读取的表格分组_09

2、数据处理(边用边总结)

3、回归

下面例子所用的文件data.csv:

50.186389494880601,69.847604158249183
52.378446219236217,86.098291205774103
50.135485486286122,59.108839267699643
33.644706006191782,69.89968164362763
39.557901222906828,44.862490711164398
56.130388816875467,85.498067778840223
57.362052133238237,95.536686846467219
60.269214393997906,70.251934419771587
35.678093889410732,52.721734964774988
31.588116998132829,50.392670135079896
53.66093226167304,63.642398775657753
46.682228649471917,72.247251068662365
43.107820219102464,57.812512976181402
70.34607561504933,104.25710158543822
44.492855880854073,86.642020318822006

3.1、线性回归

参考链接:
https://www.cnblogs.com/qiu-hua/p/14891409.html

流式读取csv----批式训练—批式预测
------------------流式读取的数据,无法在批式训练-----------
流式读取csv------流式预测
-------流式读取的数据类型就是 流式预测传入的数据类型格式,可以直接用训练好的模型---------
1、批式读取csv----批式训练—批式预测

2.批式读取csv----批式训练—流式预测
批式读取的数据是批式运算符BatchOperator 类型变量,可以直接进行训练,但是预测时需要转化为流数据:
先将BatchOperator —>>dataframe----->>StreamOperator
(1).先将BatchOperator —>>dataframe:
newdata=data.collectToDataframe()
newdata=BatchOperator.collectToDataframe(data)
(2).dataframe----->>StreamOperator:
streamData=StreamOperator.fromDataframe(newdata, schema)
streamData=dataframeToOperator(newdata, schemaStr=“col double,label double”, opType=“stream”)

训练(批式)(例子:批式读取csv----批式训练)
from pyalink.alink import *
resetEnv()
useLocalEnv(1, flinkHome=None, config=None)
批式读取csv:
schema='col double,label double'
data=CsvSourceBatchOp()\
.setFilePath("data.csv")\
.setSchemaStr(schema).setFieldDelimiter(",")
直接训练:
colnames=["col"]
lr=LinearRegTrainBatchOp().setFeatureCols(colnames).setLabelCol("label")
model=data.link(lr)
预测(批式和流式)
1.批式预测
批式读取csv:
schema='col double,label double'
data=CsvSourceBatchOp()\
.setFilePath("data.csv")\
.setSchemaStr(schema).setFieldDelimiter(",")
直接训练:
colnames=["col"]
lr=LinearRegTrainBatchOp().setFeatureCols(colnames).setLabelCol("label")
model=data.link(lr)
批式预测
predictor = LinearRegPredictBatchOp().setPredictionCol("pred")
predictor.linkFrom(model, data).firstN(5).print()
2.流式预测
批式读取csv:
schema='col double,label double'
data=CsvSourceBatchOp()\
.setFilePath("data.csv")\
.setSchemaStr(schema).setFieldDelimiter(",")
直接训练:
colnames=["col"]
lr=LinearRegTrainBatchOp().setFeatureCols(colnames).setLabelCol("label")
model=data.link(lr)
转换batchop---->>---dataframe----->>streamopdata
newdata=BatchOperator.collectToDataframe(data)或者newdata=data.collectToDataframe()

streamData=dataframeToOperator(newdata, schemaStr="col double,label double", opType="stream")或者streamData=StreamOperator.fromDataframe(newdata, ‘col double,label double’)
流式预测:
predictor = LinearRegPredictStreamOp(model).setPredictionCol("pred")
predictor.linkFrom(streamData).print()
StreamOperator.execute()

4、分类

5、聚类

数据导出

导出CSV文件

按行导出到文件

导出到Mysql