6 数据ETL

拉链表的实现(见数仓项目总结):处理周期性事实表和维表

9 车货匹配

image.png

01背包问题

输入:
values[]:价值数组
weights[]:重量数组
capacity:容量
输出:
最大总价值
dp(i, j) 是 最大承重为 j、有前 i 件物品可选 时的最大总价值

  • 初始化
    • dp(i, 0)—承重为0、dp(0, j)—物品数量为0, 初始值均为 0
  • 装不下 :背包容量 < 商品重量
    • dp[i][j]=dp[i-1][j];
  • 装得下 : 装 / 不装
    • dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1]);

车货匹配

输入:
volarr[]:货物的体积数组
capacity:车辆的容积
输出:
每辆车实际装的最大货物体积
dp[i][j]含义:前i件物品在不超过最大容积j时的体积,j == capacity

  1. 定义dp数组

int[][] dp=new int[volumeArr.length+1][capacity+1];

  1. 状态转移
  • 装不下:车辆容积 < 货物体积
    • dp[i][j]=dp[i-1][j];
  • 装得下:装 / 不装
    • dp[i][j] = Math.max(dp[i - 1][j - volumeArr[i - 1]] + volumeArr[i - 1], dp[i - 1][j]);

image.png

Structed Streaming

Structured Streaming最核心的思想就是将实时到达的数据看作是一个不断追加的unbound table无界表,到达流的每个数据项(RDD)就像是表中的一个新行被附加到无边界的表中.这样用户就可以用静态结构化数据的批处理查询方式进行流计算,如可以使用SQL对到来的每一行数据进行实时查询处理;

output mode

1.Append mode:默认模式,新增的行才输出,每次更新结果集时,只将新添加到结果集的结果行输出 到接收器。仅支持那些添加到结果表中的行永远不会更改的查询。因此,此模式保证每行仅输出一次。例如,仅查询select,where,map,flflatMap,fifilter,join等会支持追加模式。不支持聚合
2.Complete mode: 所有内容都输出,每次触发后,整个结果表将输出到接收器。聚合查询支持此功能。仅适用于包含聚合操作的查询。
3.Update mode:更新的行才输出,每次更新结果集时,仅将被更新的结果行输出到接收器(自Spark2.1.1起可用),不支持排序

output sink

image.png
配置kafka sink
image.png

实时数据采集

一、主要架构

  • 通过nginx整合kafka的生产者的代码,将消息发送到kafka指定的topic中
  • 发送消息到nigix,会由kafka的生产者自动生产到指定主题,在通过消费者去消费

image.png

二、模拟车载客户端采集数据

java程序模拟

  1. 传感器信息模拟

image.png

  1. 处理http消息

image.png

  1. 主程序,拼接消息

image.png

接收消息示意:
image.png

轨迹数据处理

总体流程:
image.png

Structured Streaming整合Kafka

数据写入Redis

需要自己实现RedisWriter
image.png
主程序流程:
image.png

数据写入Hbase

实现HbaseWriter处理数据

  • rowkey设计:

image.png

ETL数据仓库