ビッグデータの前兆に関する知識
- hadoop:hdfsをストレージとして使用するビッグデータコンピューティングフレームワークであり、複数の安価なクラスターがクラスターを形成します
- ハイブ:Hadoop分散ファイルシステムに格納されているデータを分析するための豊富なSQLクエリメソッド:構造化データファイルをデータベーステーブルにマッピングして、完全なSQLクエリ機能を提供できます。
- mapreduce:コンピューティングタスクは複数の部分に分割され、クラスターの下のコンピューターに分散され、複数のコンピューターが並列計算を実行して結果を要約します。
1.背景紹介
SparkはHadoopと同じ分散データコンピューティングフレームワークですが、HadoopはHDFSファイルストレージに基づいており、Sparkはメモリベースであるため、速度の点でHadoopよりも高速です。基本的にデータをテーブルに変換することです。
1.1主要コンポーネント
- スパークコア
- RDD:柔軟な分散データセット。読み取り専用パーティションレコードのコレクションであり、安定した物理ストレージおよびその他の既存のRDD内のデータセットに対して実行される決定論的操作に基づいてのみ作成できます。
- DAG:有向非巡回グラフ、つまり、あるポイントから始まり、数ポイント(ループなし)の後にこのポイントに戻るスパークでは、RDDの関係は、RDDの依存関係を記述するためにモデル化されます。
- Spark sql:SQLで計算ロジックを書く
Python操作で知っておく必要のある名詞は次のとおりです
- SparkContext:主にRDDの作成と操作に使用されるspark関数のエントリポイント
- SparkSession:1.2より前は、さまざまな関数を操作するにはさまざまなコンテキストが必要でしたが、SparkSessionを直接使用するのはそれらの関数の組み合わせです。
- RDDを作成および操作するときにSparkContextを使用する
- ストリーミングを使用する場合は、StreamingContextを使用します
- SQLを使用する場合は、sqlContextを使用します
- Hiveを使用する場合は、HiveContextを使用してください
- DataFrame:2次元テーブルの形式でデータを格納する基本テーブルと、RDDよりもパフォーマンスが高くストレージ構造情報を持つスキーマ(データ構造情報)
- DateSet:各フィールドのタイプを知るためにDateFrameよりも詳細
1.2環境への設置
- Windowsオペレーティングシステム
- Python 3.7
- pySparkライブラリ
二、文法などを開発する
このような基本データのリスト
{"database":"gateway_db","xid":1727259328,"data":{"point_id":"YC13002","update_time":"2020-12-27 22:00:30","ex":null,"create_time":"2020-12-27 22:00:30","point_value":3.78,"equipment":"C1","push_time":"2020-12-27 22:00:22","client_id":"d35e0c87-ed79-45ac-bf00-1e3abc35e9e3","quality":0},"old":{"update_time":"2020-12-27 21:59:30","create_time":"2020-12-27 21:59:30","point_value":3.93,"push_time":"2020-12-27 21:59:22"},"commit":true,"position":"mysql-bin.000614:445978746","type":"update","server_id":1228688365,"table":"real_msg","ts":1609077630}
2.1データの読み取り
ossから読み取る、kafkaから読み取る、ローカルファイルから読み取ることができます
spark = SparkSession.builder\
.appName("test") \
.config("spark.some.config.option", "一些设置") \
.getOrCreate()
# 这个是读取json 文件 将每一个读取成 dataframe
df = spark.read.json("F://prod-zhongda+0+0024526281.json")
# 读取csv 也是一样
df = spark.read.csv("F://prod-zhongda+0+0024526281.csv")
2.2データフィルタリング
# filter 过滤
# 第一种 直接在 "" 里面写表达式
df.filter(" xid > 33333333 ")
# 第二种 直接写表达式
df.filter(df.xid > 33333)
# where 过滤
df.where(df.xid > 3333)
# udf 过滤
from pyspark.sql.functions import udf
from pyspark.sql.types import *
# 可以直接定义一个自定义函数 并注册进 sql 可以用的
test_method = udf(lambda x:(x+1),LongType())
spark.udf.register("test_method", test_method)
#也可以在注册的时候 直接定义一个函数
spark.udf.register("test_method", test_method)
2.3APIデータの計算/処理
この計算と処理では、最初にそれがdfかrddかを判別する必要があります。
# 输出 df 的格式
print(df.printSchema())
# 将 df转成 一个list
dfList = df.collect()
2.4SQLによる計算と処理
まず、メモリ内にテーブルを作成してから、このテーブルを操作します。セッションが閉じられると、テーブルは削除されます。
# 创建一个临时表
df.createOrReplaceTempView("data_handler");
# 用sql 查询临时表中的数据
df = spark.sql("select * from data_handler")
# 用select 对数据进行 处理过滤
# 可以查看每一列的值
df2 = df.select("xid","data")
# 也可以对进行分组聚合 分组和聚合一般都是放在一起算的
# 分组
group = df.groupby("xid")
# 聚合
# 可以直接用函数 {"字段名":"函数"} 分完组了也可以根据其他的字段
df3 = group.agg({
"ts":"max"})
# 也可以引入函数进行聚合 可以返回多个字段
from pyspark.sql import functions as F
df3 = group.agg(F.max("ts"),F.min("ts"))
# 将多个表进行连接 根据表达式里面的字段进行连接
df4 = df3.join(df,df["ts"] == df3["ts"])
RDD、DateFrame、DateSetの違いと共通性
- 同じ点
- まず第一に、それらは遅延してロードされ、アクションとforeachに遭遇したときにのみ計算されます
- 3つにはパーティションの概念があり、3つにはフィルター、並べ替えなどの多くの共通機能があります。
- 3つはスパークメモリの状況に応じて自動的に操作をキャッシュするため、データ量が多い場合でもメモリのオーバーフローを心配する必要はありません。
- 違い:コントロールの強さがひとつひとつ違う気がします。