site:enseignement:master:bdle:supports-cours:spark
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
site:enseignement:master:bdle:supports-cours:spark [15/11/2018 17:20] – amine | site:enseignement:master:bdle:supports-cours:spark [15/11/2018 18:12] (Version actuelle) – [Analyser du JSON en Spark SQL] amine | ||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
===== Datasets utilisés ===== | ===== Datasets utilisés ===== | ||
==== TPCH ==== | ==== TPCH ==== | ||
+ | Désarchiver dans votre espace perso <code bash>/ | ||
+ | L' | ||
+ | < | ||
+ | PARTKEY, | ||
+ | 1,goldenrod lace spring peru powder, | ||
+ | 2,blush rosy metallic lemon navajo, | ||
+ | </ | ||
+ | En étant dans tpch-extrait, | ||
+ | <code bash> | ||
+ | hadoop fs -mkdir /tpch | ||
+ | hadoop fs -put lineitem.tbl /tpch | ||
+ | hadoop fs -put part.tbl /tpch | ||
+ | </ | ||
+ | puis vérifier que les fichiers existent | ||
+ | <code bash> | ||
+ | hadoop fs -ls /tpch | ||
+ | </ | ||
+ | |||
+ | |||
+ | Les instructions suivantes sont communes aux deux sous-sections qui suivent et permette de charger les fichiers de l' | ||
+ | |||
+ | <code scala> | ||
+ | val tpch="/ | ||
+ | val lineitem_t = tpch+" | ||
+ | val part_t = tpch+" | ||
+ | </ | ||
+ | |||
===== Spark RDD ===== | ===== Spark RDD ===== | ||
+ | |||
+ | Les instructions suivantes correspondent à la version Q17 simplifiée de TPCH suivante (attention, syntaxe incompatible avec certains compilateurs SQL) | ||
+ | <code sql> | ||
+ | |||
+ | SELECT sum(l_extendedprice) / 7.0 AS avg_yearly | ||
+ | FROM (SELECT l_partkey, 0.2* avg(l_quantity) AS t1 | ||
+ | FROM lineitem GROUP BY l_partkey) AS inner, | ||
+ | (SELECT l_partkey, | ||
+ | WHERE p_partkey = l_partkey) AS outer | ||
+ | WHERE outer.l_partkey = inner.l_partkey AND outer.l_quantity < inner.t1; | ||
+ | </ | ||
+ | |||
+ | On peut exprimer cette requête en RDD comme suit | ||
+ | <code scala> | ||
+ | |||
+ | val lineitem = sc.textFile(lineitem_t). | ||
+ | filter(!_.contains(" | ||
+ | .map(x=> | ||
+ | .map(x=> | ||
+ | //schema (PARTKEY, QUANTITY, EXTENDEDPRICE, | ||
+ | //count = 6,001,215 | ||
+ | |||
+ | val part = sc.textFile(part_t) | ||
+ | .filter(!_.contains(" | ||
+ | .map(x=> | ||
+ | .map(x=> | ||
+ | |||
+ | //schema (PARTKEY) | ||
+ | //count = 200,000 | ||
+ | |||
+ | def myAvg(tab: | ||
+ | val inner = lineitem | ||
+ | .map{case(partkey, | ||
+ | .groupByKey | ||
+ | .mapValues(x=> | ||
+ | |||
+ | val outer = lineitem | ||
+ | .map{case(partkey, | ||
+ | .join(part.map(x=> | ||
+ | .map{case(partkey, | ||
+ | |||
+ | val query = inner | ||
+ | .join(outer) | ||
+ | .filter{case(partkey, | ||
+ | .map{case(partkey, | ||
+ | |||
+ | val res = query.sum/7 | ||
+ | </ | ||
+ | Pour afficher le plan d' | ||
+ | <code scala> | ||
+ | </ | ||
+ | Pour visualiser le plan d' | ||
+ | |||
+ | |||
===== Spark SQL ===== | ===== Spark SQL ===== | ||
+ | Le but ici est d' | ||
+ | |||
+ | |||
+ | <code scala> | ||
+ | import spark.implicits._ | ||
+ | |||
+ | |||
+ | val lineitem = spark.read.format(" | ||
+ | |||
+ | val part = spark.read.format(" | ||
+ | |||
+ | </ | ||
+ | |||
+ | Les instructions suivantes expriment les sous-expression de la requête | ||
+ | < | ||
+ | val inner = lineitem.groupBy(" | ||
+ | |||
+ | val outer = lineitem.join(part, | ||
+ | |||
+ | val q17_simp = inner.join(outer, | ||
+ | |||
+ | q17_simp.show() | ||
+ | </ | ||
+ | |||
+ | Pour examiner les plans logiques et physique utiliser le explain | ||
+ | <code scala> | ||
+ | q17_simp.explain(true) | ||
+ | </ | ||
+ | Il est aussi possible de visualizer le plan physique et les Stages de l' | ||
+ | ===== Analyser du JSON en Spark SQL ===== | ||
+ | Les extrait du cours sont dans <code bash>/ | ||
+ | Chaque fichier de l' | ||
+ | L' | ||
+ | |||
+ | <code scala> |
site/enseignement/master/bdle/supports-cours/spark.1542298846.txt.gz · Dernière modification : de amine