「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>.NET for Apache Spark]]
--.NET for Apache Sparkチュートリアル
--[[.NET for Apache Sparkのデータ接続]]
--[[.NET for Apache SparkのSQL]]

* 目次 [#je3d6ac1]
#contents

*概要 [#ee897365]

**チュートリアル [#cbcd8222]
以下のチュートリアルを実施してみた。
>[[Get started in 10 minutes>#g7fce881]]~
≒ [[.NET for Apache Spark 101>#vf8b2398]]-α~
≒ [[.NET for Apache Spark ガイド>#zd2d65ee]]-α~
≠ github.com...README.md#get-started

**前提 [#s695f3aa]
-情報源
--2020/11の情報
--Microsoft Docsベース

-ローカルはWindows
***初回 [#c8e7248e]
-OS~
Windows

-ランタイム
--.NET:netcoreapp3.1
--Java:jdk-8u201-windows-x64.exe

-ミドルウェア
--Apache Spark
---ver:2.4.1
---パス:
 C:\prog\spark\spark-2.4.1-bin-hadoop2.7
 C:\prog\dev\spark\spark-2.4.1-bin-hadoop2.7

--.NET for Apache Spark
---ver:1.0.0
---パス:
 C:\prog\spark\Microsoft.Spark.Worker-1.0.0
 C:\prog\dev\spark\Microsoft.Spark.Worker-1.0.0

--winutils.exe
--winutils.exe~
Windowsで利用できるHadoopバイナリ
---ver:.../hadoop-2.7.1/bin/winutils.exe
---パス:
 C:\prog\spark\spark-2.4.1-bin-hadoop2.7\bin
 C:\prog\dev\spark\spark-2.4.1-bin-hadoop2.7\bin

-その他

--7-Zip(インストール済み)

***Ver-UP 1 [#z5eb69b2]
-Apache Spark
--ver:3.0.1
---パス:
 C:\prog\dev\spark\spark-3.0.1-bin-hadoop2.7

--.NET for Apache Spark
---ver:2.0.0
---パス:
 C:\prog\dev\spark\Microsoft.Spark.Worker-2.0.0

-実行時、spark-submitの引数に指定する、~
<application-jar>のバージョンを上げておく。
 microsoft-spark-2-4_2.11-1.0.0.jar
 → microsoft-spark-3-0_2.12-2.0.0.jar

*詳細 [#oa8d7c9e]

**開発 [#le456446]

***[[Get started in 10 minutes>#g7fce881]] [#s680c185]
-デモを見た限り、入力はTXTファイルで単語を数える。
-[[メソッド構文のSpark SQL>.NET for Apache Spark#x77ba954]]で単語を数える(いきなりハードル高い)。
-[[分散環境では、どのように入力を取得するのか?>#bf921206]]
-概要
--デモを見た限り、入力はTXTファイルで単語を数える。
--[[メソッド構文のSpark SQL>.NET for Apache Spark#x77ba954]]で単語を数え集計して表示(いきなりハードル高い)。

-コピペ用CMD
-CMDコピペ用

--Apache Spark

---HOMEの指定
 setx /M HADOOP_HOME C:\prog\spark\spark-2.4.1-bin-hadoop2.7\
 setx /M SPARK_HOME C:\prog\spark\spark-2.4.1-bin-hadoop2.7\
 setx /M PATH "%PATH%;%HADOOP_HOME%;%SPARK_HOME%\bin"
 setx /M HADOOP_HOME C:\prog\dev\spark\spark-2.4.1-bin-hadoop2.7\
 setx /M SPARK_HOME C:\prog\dev\spark\spark-2.4.1-bin-hadoop2.7\
 setx /M PATH "%PATH%;%HADOOP_HOME%;%SPARK_HOME%bin"
※ &color(red){注意};:\binとすると、spark-3.0.1-bin-hadoop2.7&color(red){\\};binとなって動かない。

---動作確認
 >spark-submit --version
 Welcome to
 
      / __/__  ___ _____/ /__
     _\ \/ _ \/ _ `/ __/  '_/
    /___/ .__/\_,_/_/ /_/\_\   version 2.4.1
       /_/
 
 Using Scala version 2.11.12, Java HotSpot(TM) 64-Bit Server VM, 1.8.0_201
 Branch
 Compiled by user  on 2019-03-26T22:44:44Z
 Revision
 Url
 Type --help for more information.

--.NET for Apache Spark

---パス設定
 setx /M DOTNET_WORKER_DIR C:\prog\spark\Microsoft.Spark.Worker-1.0.0
 setx /M DOTNET_WORKER_DIR C:\prog\dev\spark\Microsoft.Spark.Worker-1.0.0

---動作確認~
以下のアプリをビルドして動作させる。

-アプリ

--物体~
https://github.com/OpenTouryoProject/SampleProgram/tree/master/Azure/DotNet4ApacheSpark/MySparkApp

--実行
 \MySparkApp\bin\Debug\netcoreapp3.1>spark-submit ^
 --class org.apache.spark.deploy.dotnet.DotnetRunner ^
 --master local ^
 microsoft-spark-2-4_2.11-1.0.0.jar ^
 dotnet MySparkApp.dll input.txt
 ...
 20/11/19 12:39:29 INFO CodeGenerator: Code generated in 10.4659 ms
 +------+-----+
 |  word|count|
 +------+-----+
 |  .NET|    3|
 |Apache|    2|
 |   app|    2|
 |  This|    2|
 | Spark|    2|
 | World|    1|
 |counts|    1|
 |   for|    1|
 | words|    1|
 |  with|    1|
 | Hello|    1|
 |  uses|    1|
 +------+-----+
 
 20/11/19 12:39:29 INFO SparkUI: Stopped Spark web UI at http://nishi.mshome.net:4040
 ...

***バッチ処理 [#l7b4829d]
-デモを見た限り、入力はCSVファイルで集計処理を行う。
--[[SQLの説明>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Spark%20SQL#oaa10345]]

-集計処理は以下の2つ
--[[メソッド構文のSpark SQL>.NET for Apache Spark#x77ba954]]で言語毎のフォークの平均回数を降順に並べる。
--[[UDF>.NET for Apache Spark#w1fa929a]]を[[メソッド構文のSpark SQL>.NET for Apache Spark#x77ba954]]から利用し、指定の日付以降の更新日付を示す。
***[[バッチ処理>#zd2d65ee]] [#l7b4829d]
-概要
--デモを見た限り、入力はCSVファイルで集計処理を行う。
--集計処理は以下の2つ
---[[メソッド構文のSpark SQL>.NET for Apache Spark#x77ba954]]で言語毎のフォークの平均回数を降順に並べる。
---[[UDF>.NET for Apache Spark#w1fa929a]]を[[メソッド構文のSpark SQL>.NET for Apache Spark#x77ba954]]から利用し、指定の日付以降の更新日付を示す。

-同様に、[[分散環境では、どのように入力を取得するのか?>#bf921206]]
-アプリ

***構造化ストリーミング [#v2288c2e]
--物体~
https://github.com/OpenTouryoProject/SampleProgram/tree/master/Azure/DotNet4ApacheSpark/mySparkBatchApp

--実行
 >spark-submit ^
 --class org.apache.spark.deploy.dotnet.DotnetRunner ^
 --master local ^
 microsoft-spark-2-4_2.11-1.0.0.jar ^
 dotnet mySparkBatchApp.dll projects_smaller.csv
 ...
 +----+--------------------+--------+--------------------+--------------------+--------+---------------+-----------+-------+-------------------+
 |  id|                 url|owner_id|                name|          descriptor|language|     created_at|forked_from|deleted|         updated_at|
 +----+--------------------+--------+--------------------+--------------------+--------+---------------+-----------+-------+-------------------+
 |   1|https://api.githu...|       1|           ruote-kit|RESTful wrapper f...|    Ruby|12/8/2009 10:17|          2|      0|     11/5/2015 1:15|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |   4|https://api.githu...|      24|             basemap|                null|     C++|6/14/2012 14:14|          3|      1|0000-00-00 00:00:00|
 |   5|https://api.githu...|      28|           cocos2d-x|Port of cocos2d-i...|     C++|3/12/2012 16:48|          6|      0|   10/22/2015 17:36|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |   7|https://api.githu...|      42|           cocos2d-x|Port of cocos2d-i...|       C|4/23/2012 10:20|          6|      0|    11/1/2015 17:32|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |   9|https://api.githu...|      66|       rake-compiler|Provide a standar...|    Ruby| 8/1/2012 18:33|   14556189|      0|    11/3/2015 19:30|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |  12|https://api.githu...|      70|heroku-buildpack-...|                null|   Shell| 8/2/2012 12:50|         11|      0|     11/2/2015 7:34|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 |null|                null|    null|                null|                null|    null|           null|       null|   null|               null|
 +----+--------------------+--------+--------------------+--------------------+--------+---------------+-----------+-------+-------------------+
 only showing top 20 rows
 
 +--------------------+--------------------+-----------+----------------+-----------+-------+-------------------+
 |                name|          descriptor|   language|      created_at|forked_from|deleted|         updated_at|
 +--------------------+--------------------+-----------+----------------+-----------+-------+-------------------+
 |           ruote-kit|RESTful wrapper f...|       Ruby| 12/8/2009 10:17|          2|      0|     11/5/2015 1:15|
 |           cocos2d-x|Port of cocos2d-i...|        C++| 3/12/2012 16:48|          6|      0|   10/22/2015 17:36|
 |           cocos2d-x|Port of cocos2d-i...|          C| 4/23/2012 10:20|          6|      0|    11/1/2015 17:32|
 |       rake-compiler|Provide a standar...|       Ruby|  8/1/2012 18:33|   14556189|      0|    11/3/2015 19:30|
 |    cobertura-plugin|Jenkins cobertura...|       Java| 7/26/2012 18:46|     193522|      0|    11/1/2015 19:55|
 |     scala-vs-erlang|A performance tes...|     Erlang|12/25/2011 13:51|    1262879|      0|    10/22/2015 4:50|
 |              opencv|OpenCV GitHub Mirror|        C++|  8/2/2012 12:50|         29|      0|    10/26/2015 6:44|
 | redmine_git_hosting|A ChiliProject/Re...|       Ruby| 7/30/2012 12:53|         42|      0|   10/28/2015 10:54|
 | redmine_git_hosting|A ChiliProject/Re...|       Ruby|10/26/2011 23:17|     207450|      0|   10/27/2015 22:43|
 |          OpenCV-iOS|This project is a...|Objective-C|  8/2/2012 12:55|         39|      1|0000-00-00 00:00:00|
 |           browserid|A secure, distrib...| JavaScript| 6/30/2012 22:35|       1589|      0|    10/10/2015 0:34|
 |      protobuf-cmake|CMake build suppo...|         \N|  8/2/2012 14:35|         61|      0|    10/31/2015 1:22|
 |                loso|Chinese segmentat...|     Python|  8/2/2012 12:57|         67|      1|0000-00-00 00:00:00|
 |                yui3| YUI 3.x Source Tree| JavaScript| 7/13/2012 14:48|         55|      1|0000-00-00 00:00:00|
 |         doctag_java|Java library for ...|       Java|  8/2/2012 12:57|         70|      1|0000-00-00 00:00:00|
 |willdurand.github...|        My new blog!| JavaScript|  8/2/2012 12:06|         84|      0|     11/4/2015 9:15|
 |            manaserv|A flexible 2D MMO...|        C++|  8/1/2011 17:05|         90|      0|    10/10/2015 4:42|
 |            manaserv|A flexible 2D MMO...|        C++| 3/24/2011 17:38|         90|      0|   10/16/2015 18:29|
 |               libuv|platform layer fo...|          C|  8/2/2012 12:57|         74|      0|    10/31/2015 8:21|
 |         cucumber-js|Pure Javascript C...| JavaScript| 5/28/2012 15:47|      10457|      1|0000-00-00 00:00:00|
 +--------------------+--------------------+-----------+----------------+-----------+-------+-------------------+
 only showing top 20 rows
 
 +------------+------------------+
 |    language|  avg(forked_from)|
 +------------+------------------+
 |      Racket|       1.2550711E7|
 |    Makefile|         3611689.0|
 |ActionScript|        2474502.75|
 |      Erlang|         1262879.0|
 |          C#|        914767.625|
 |         PHP| 617219.4333333333|
 |         C++| 448911.1538461539|
 |        Ruby|349311.23214285716|
 |        Perl|          298380.0|
 |      Puppet|          253680.5|
 |  JavaScript| 240718.6494845361|
 |        Java|      149923.71875|
 |      Python| 76043.26190476191|
 |       Shell|           13276.6|
 | Objective-C|2281.4761904761904|
 |          \N| 1995.095238095238|
 |           C|1576.4705882352941|
 |       Scala|            1358.5|
 |      Groovy|            1049.0|
 |        HaXe|             829.0|
 +------------+------------------+
 only showing top 20 rows
 
 [2021-06-25T05:26:32.6714551Z] [NISHI] [Debug] [ConfigurationService] Using the environment variable to construct .NET worker path:
 ...\spark\Microsoft.Spark.Worker-1.0.0\Microsoft.Spark.Worker.exe.
 +--------------------+--------------------+-----------+----------------+-----------+-------+-------------------+----------+
 |                name|          descriptor|   language|      created_at|forked_from|deleted|         updated_at|datebefore|
 +--------------------+--------------------+-----------+----------------+-----------+-------+-------------------+----------+
 |           ruote-kit|RESTful wrapper f...|       Ruby| 12/8/2009 10:17|          2|      0|     11/5/2015 1:15|      true|
 |           cocos2d-x|Port of cocos2d-i...|        C++| 3/12/2012 16:48|          6|      0|   10/22/2015 17:36|      true|
 |           cocos2d-x|Port of cocos2d-i...|          C| 4/23/2012 10:20|          6|      0|    11/1/2015 17:32|      true|
 |       rake-compiler|Provide a standar...|       Ruby|  8/1/2012 18:33|   14556189|      0|    11/3/2015 19:30|      true|
 |    cobertura-plugin|Jenkins cobertura...|       Java| 7/26/2012 18:46|     193522|      0|    11/1/2015 19:55|      true|
 |     scala-vs-erlang|A performance tes...|     Erlang|12/25/2011 13:51|    1262879|      0|    10/22/2015 4:50|      true|
 |              opencv|OpenCV GitHub Mirror|        C++|  8/2/2012 12:50|         29|      0|    10/26/2015 6:44|      true|
 | redmine_git_hosting|A ChiliProject/Re...|       Ruby| 7/30/2012 12:53|         42|      0|   10/28/2015 10:54|      true|
 | redmine_git_hosting|A ChiliProject/Re...|       Ruby|10/26/2011 23:17|     207450|      0|   10/27/2015 22:43|      true|
 |          OpenCV-iOS|This project is a...|Objective-C|  8/2/2012 12:55|         39|      1|0000-00-00 00:00:00|     false|
 |           browserid|A secure, distrib...| JavaScript| 6/30/2012 22:35|       1589|      0|    10/10/2015 0:34|     false|
 |      protobuf-cmake|CMake build suppo...|         \N|  8/2/2012 14:35|         61|      0|    10/31/2015 1:22|      true|
 |                loso|Chinese segmentat...|     Python|  8/2/2012 12:57|         67|      1|0000-00-00 00:00:00|     false|
 |                yui3| YUI 3.x Source Tree| JavaScript| 7/13/2012 14:48|         55|      1|0000-00-00 00:00:00|     false|
 |         doctag_java|Java library for ...|       Java|  8/2/2012 12:57|         70|      1|0000-00-00 00:00:00|     false|
 |willdurand.github...|        My new blog!| JavaScript|  8/2/2012 12:06|         84|      0|     11/4/2015 9:15|      true|
 |            manaserv|A flexible 2D MMO...|        C++|  8/1/2011 17:05|         90|      0|    10/10/2015 4:42|     false|
 |            manaserv|A flexible 2D MMO...|        C++| 3/24/2011 17:38|         90|      0|   10/16/2015 18:29|     false|
 |               libuv|platform layer fo...|          C|  8/2/2012 12:57|         74|      0|    10/31/2015 8:21|      true|
 |         cucumber-js|Pure Javascript C...| JavaScript| 5/28/2012 15:47|      10457|      1|0000-00-00 00:00:00|     false|
 +--------------------+--------------------+-----------+----------------+-----------+-------+-------------------+----------+
 only showing top 20 rows
 ...

--[[SQLの説明>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Spark%20SQL#n1c1114b]]

***[[構造化ストリーミング>#zd2d65ee]] [#v2288c2e]

-概要~
(別名、マイクロ・バッチ)

-デモを見た限り、入力はNetcatからのテキスト行で、変換処理を行う。
-[[UDF>.NET for Apache Spark#w1fa929a]]を[[メソッド構文のSpark SQL>.NET for Apache Spark#x77ba954]]から利用し、エンリッチメントする。
-同様に、[[分散環境では、どのように入力を取得するのか?>#bf921206]]
--デモを見た限り、入力はNetcatからのテキスト行で、変換処理を行う。

***[[ML.NET]] での感情分析 [#bb5afcf2]
--[[UDF>.NET for Apache Spark#w1fa929a]]を[[メソッド構文のSpark SQL>.NET for Apache Spark#x77ba954]]から利用し、エンリッチメントする。

-デモを見た限り、入力はyelptest.csvで、感情分析を行う。
-なお、学習は、yelptrain.csvを使用して行う。
-学習の結果、XXXXML.Modelプロジェクトが生成されるので、参照を追加する。
-ML処理を呼出す[[UDF>.NET for Apache Spark#w1fa929a]]を[[クエリ構文のSpark SQL>.NET for Apache Spark#x77ba954]]から利用する。
-同様に、[[分散環境では、どのように入力を取得するのか?>#bf921206]]
--なお、ストリーミング処理では、ループを書くのではなく、StreamingQueryを使用する模様。
---これは、Spark SQL エンジンに基づいた、Structured Streamingによる。
---StreamingQueryのStartでアプリケーションが開始する(読込 → 変換 → 書込の逐次実行)。
---StreamingQueryのAwaitTerminationでアプリケーションが外部から停止されるまで実行。

-アプリ

--物体~
https://github.com/OpenTouryoProject/SampleProgram/tree/master/Azure/DotNet4ApacheSpark/mySparkStreamingApp

--実行

---[[ncコマンド>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?nc%20%28netcat%29%20%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89]]でリスナーを作成([[WSL>Windows Subsystem for Linux]]を使用
 $ nc -lk 9999
 abcdefg

---spark-submitでデプロイ
 >spark-submit ^
 --class org.apache.spark.deploy.dotnet.DotnetRunner ^
 --master local ^
 microsoft-spark-2-4_2.11-1.0.0.jar ^
 dotnet mySparkStreamingApp.dll localhost 9999
 ...
 -------------------------------------------
 Batch: x
 -------------------------------------------
 +---------+
 |      col|
 +---------+
 |  abcdefg|
 |abcdefg 7|
 +---------+

--[[SQLの説明>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Spark%20SQL#kfcf74cc]]

-参考
--[[Spark Streaming - 開発基盤部会 Wiki > Structured Streaming>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Spark%20Streaming#z0ea8bef]]
--Spark Structured Streaming with Kafka~
https://www.slideshare.net/SotaroKimura/spark-structured-streaming-with-kafka

***[[ML.NETでの感情分析>#zd2d65ee]] [#bb5afcf2]
&color(red){ココから以降、Microsoft.Sparkのバージョンを2.0.0に上げている。};

-概要
--デモを見た限り、入力はyelptest.csvで、感情分析を行う。
--なお、学習は、yelptrain.csvを使用して行う。
--学習の結果、XXXXML.Modelプロジェクトが生成されるので、参照を追加する。
--ML処理を呼出す[[UDF>.NET for Apache Spark#w1fa929a]]を[[クエリ構文のSpark SQL>.NET for Apache Spark#x77ba954]]から利用する。

-学習
--シナリオ タイルは「感情分析」ではなく「テキストの分類」。~
--また、「トレーニンする時間」が短いと、~
「トレーニング期間が終了しましたが、トレーニングされたモデルがありません。」~
なるエラーが発生することがある(時間を長くすると解決する)。
 GPU Service not found. Falling back to CPU AutoML Service.
 |     Trainer                              MicroAccuracy  MacroAccuracy  Duration #Iteration                     |
 |1    AveragedPerceptronOva                       0.7885         0.7924       5.0          1                     |
 |2    SdcaMaximumEntropyMulti                     0.7966         0.7675       7.2          2                     |
 |3    LightGbmMulti                               0.7442         0.7365      11.4          3                     |
 |4    SymbolicSgdLogisticRegressionOva            0.7115         0.7144       3.4          4                     |
 
 ===============================================Experiment Results=================================================
 ------------------------------------------------------------------------------------------------------------------
 |                                                     Summary                                                    |
 ------------------------------------------------------------------------------------------------------------------
 |ML Task: multiclass-classification                                                                              |
 |Dataset: ...\MLSparkModel\yelptrain.csv                                                                       |
 |Label : Sentiment                                                                                               |
 |Total experiment time : 27.0050593 Secs                                                                         |
 |Total number of models explored: 4                                                                              |
 ------------------------------------------------------------------------------------------------------------------
 
 |                                              Top 4 models explored                                             |
 ------------------------------------------------------------------------------------------------------------------
 |     Trainer                              MicroAccuracy  MacroAccuracy  Duration #Iteration                     |
 |1    SdcaMaximumEntropyMulti                     0.7966         0.7675       7.2          1                     |
 |2    AveragedPerceptronOva                       0.7885         0.7924       5.0          2                     |
 |3    LightGbmMulti                               0.7442         0.7365      11.4          3                     |
 |4    SymbolicSgdLogisticRegressionOva            0.7115         0.7144       3.4          4                     |
 ------------------------------------------------------------------------------------------------------------------
 
 Code Generated

-アプリ

--物体~
https://github.com/OpenTouryoProject/SampleProgram/tree/master/Azure/DotNet4ApacheSpark/MLSparkModel

--実行
 >spark-submit ^
 --class org.apache.spark.deploy.dotnet.DotnetRunner ^
 --master local ^
 microsoft-spark-3-0_2.12-2.0.0.jar ^
 dotnet MLSparkModelML.ConsoleApp.dll yelptest.csv MLModel.zip
 ...
 +--------------------+---------+
 |          ReviewText|Sentiment|
 +--------------------+---------+
 |Waitress was swee...|        1|
 |I also had to tas...|        1|
 |I'd rather eat ai...|        0|
 |Cant say enough g...|        1|
 |The ambiance was ...|        1|
 |The waitress and ...|        1|
 |I would not recom...|        0|
 |Overall I wasn't ...|        0|
 |My gyro was basic...|        0|
 |   Terrible service!|        0|
 |Thoroughly disapp...|        0|
 |I don't each much...|        1|
 |Give it a try, yo...|        1|
 |By far the BEST c...|        1|
 |Reasonably priced...|        1|
 |Everything was pe...|        1|
 |The food is very ...|        1|
 |it was a drive to...|        0|
 |At first glance i...|        1|
 |Anyway, I do not ...|        0|
 +--------------------+---------+
 only showing top 20 rows
※ &color(red){色々と試したが、動かなかった。};

>
-UDF仕込んでshowするとエラーになったり、
-Could not load type 'Microsoft.ML.Data.DataViewTypeAttribute' と言うエラーが出たり。

--[[SQLの説明>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Spark%20SQL#g8615de3]]

***ウィンドウ関数の利用 [#w3d503ab]

-概要~
ウィンドウ関数で、対象レコード以外の~
レコードを参照することができるらしい。

-アプリ~

--物体~
以下を比較。
---https://github.com/dotnet/spark/blob/main/examples/Microsoft.Spark.CSharp.Examples/Sql/Streaming/StructuredNetworkCharacterCount.cs
---https://github.com/dotnet/spark/blob/main/examples/Microsoft.Spark.CSharp.Examples/Sql/Streaming/StructuredNetworkWordCount.cs
---https://github.com/dotnet/spark/blob/main/examples/Microsoft.Spark.CSharp.Examples/Sql/Streaming/StructuredNetworkWordCountWindowed.cs
---https://github.com/dotnet/spark/blob/main/examples/Microsoft.Spark.CSharp.Examples/Sql/Streaming/StructuredKafkaWordCount.cs

--実行~

---[[構造化ストリーミング>#v2288c2e]]同様、~
ncでリスナーを作成([[WSL>Windows Subsystem for Linux]]を使用
 $ nc -lk 9999
 abcdefg

---StructuredNetworkCharacterCountの実行結果
 >spark-submit ^
 --class org.apache.spark.deploy.dotnet.DotnetRunner ^
 --master local ^
 microsoft-spark-3-0_2.12-2.0.0.jar ^
 dotnet StructuredNetworkCharacterCount.dll localhost 9999
 ...
 -------------------------------------------
 Batch: 0
 -------------------------------------------
 +---+
 |col|
 +---+
 +---+
 ...
 -------------------------------------------
 Batch: 1
 -------------------------------------------
 21/07/30 11:18:09 INFO CodeGenerator: Code generated in 10.39 ms
 +--------+
 |     col|
 +--------+
 |   dsada|
 | dsada 5|
 |  dsadas|
 |dsadas 6|
 +--------+
 ...

---StructuredNetworkWordCountの実行結果
 >spark-submit ^
 --class org.apache.spark.deploy.dotnet.DotnetRunner ^
 --master local ^
 microsoft-spark-3-0_2.12-2.0.0.jar ^
 dotnet StructuredNetworkWordCount.dll localhost 9999
 ...
※ &color(red){トラブルシューティング中};

---StructuredNetworkWordCountWindowedの実行結果
 >spark-submit ^
 --class org.apache.spark.deploy.dotnet.DotnetRunner ^
 --master local ^
 microsoft-spark-3-0_2.12-2.0.0.jar ^
 dotnet StructuredNetworkWordCountWindowed.dll localhost 9999
 ...
※ &color(red){トラブルシューティング中};

-参考
--[[同様の処理をPython (PySpark)で書く(structured_network_wordcount_windowed.py)>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?PySpark#x623bccd]]

**デプロイ [#b151a3cc]
リンク先を読むと解るが差は僅か。

***[[Azure HDInsight>Azure HDInsight#g5c4a9f0]] [#y2aa662f]
***[[Azure Databricks>Azure Databricks#e7380cc6]] [#afd6d3ae]
***[[Azure Databricks>Azure Databricks#td9a437e]] [#afd6d3ae]

**分散環境での入力 [#bf921206]
**分散環境での入出力 [#bf921206]

***分散環境 [#o8d2ac58]
[[デプロイ>#b151a3cc]]を見ると、クラスタ上で、複数のジョブを起動すれば良い。
-基本的には、マネージド・サービスのクラスタを利用する。
-[[分散処理は、Spark SQLにより、隠蔽される。>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Apache%20Spark#ee411713]]

***入力 [#n48f44d7]
-テキスト・ファイルの場合
***入出力 [#n48f44d7]
-[[.NET for Apache Sparkのデータ接続]]

--Azure HDInsight~
[[マウントされたストレージに直接アップロード>Azure HDInsight#z4b8527c]]
**遅延評価で実現されること。 [#z135909e]
***[[自動的な分散>#o8d2ac58]]。 [#t663993c]
***[[ストリーミング>#v2288c2e]]。 [#x0138a72]
ループで書かない。

--Azure Databricks~

-Clientの場合~
Serverアドレスを引数で渡せば良い。

-Server~
リスナーを起動したときのアドレスが不明。
--Azure HDInsight~
--Azure Databricks~

*参考 [#g102834f]

**msdn.com [#y8581d41]

***Channel 9 > .NET for Apache Spark 101 [#vf8b2398]
https://channel9.msdn.com/Series/NET-for-Apache-Spark-101

「[[.NET for Apache Spark ガイドのチュートリアル部>#zd2d65ee]]」を動画化してある。

-What is .NET for Apache Spark? [1 of 8]~
-https://channel9.msdn.com/Series/NET-for-Apache-Spark-101

--What is .NET for Apache Spark? [1 of 8]~
https://channel9.msdn.com/Series/NET-for-Apache-Spark-101/What-is-NET-for-Apache-Spark

-Run Your First .NET for Apache Spark App [2 of 8]~
--Run Your First .NET for Apache Spark App [2 of 8]~
https://channel9.msdn.com/Series/NET-for-Apache-Spark-101/Run-Your-First-NET-for-Apache-Spark-App

-Batch Processing with .NET for Apache Spark [3 of 8]~
--Batch Processing with .NET for Apache Spark [3 of 8]~
https://channel9.msdn.com/Series/NET-for-Apache-Spark-101/Batch-Processing-with-NET-for-Apache-Spark

-Structured Streaming with .NET for Apache Spark [4 of 8]~
--Structured Streaming with .NET for Apache Spark [4 of 8]~
https://channel9.msdn.com/Series/NET-for-Apache-Spark-101/Structured-Streaming-with-NET-for-Apache-Spark

-Sentiment Analysis with .NET for Apache Spark and ML.NET
--Part 1 [5 of 8]~
--Sentiment Analysis with .NET for Apache Spark and ML.NET
---Part 1 [5 of 8]~
https://channel9.msdn.com/Series/NET-for-Apache-Spark-101/Sentiment-Analysis-with-NET-for-Apache-Spark-and-MLNET-Part-1
--Part 2 [6 of 8]~
---Part 2 [6 of 8]~
https://channel9.msdn.com/Series/NET-for-Apache-Spark-101/Sentiment-Analysis-with-NET-for-Apache-Spark-and-MLNET-Part-2

-Deploy .NET for Apache Spark App to
--[[Azure HDInsight>Azure HDInsight#w086a731]]
--[[Azure Databricks>Azure Databricks#qb9ddd3a]]
--Deploy .NET for Apache Spark App to
---[[Azure HDInsight>Azure HDInsight#w086a731]]
---[[Azure Databricks>Azure Databricks#qb9ddd3a]]

-YouTube~
https://www.youtube.com/playlist?list=PLdo4fOcmZ0oXklB5hhg1G1ZwOJTEjcQ5z

**microsoft.com [#x7a1c48d]

***Get started in 10 minutes [#g7fce881]
https://dotnet.microsoft.com/learn/data/spark-tutorial/intro

-Install .NET~
https://dotnet.microsoft.com/learn/data/spark-tutorial/install-dotnet
-Install Prerequisites~
https://dotnet.microsoft.com/learn/data/spark-tutorial/install-pre-reqs
-Install Apache Spark~
https://dotnet.microsoft.com/learn/data/spark-tutorial/install-spark
-Install .NET for Apache Spark~
https://dotnet.microsoft.com/learn/data/spark-tutorial/install-worker
-Create your app~
https://dotnet.microsoft.com/learn/data/spark-tutorial/create
-Install NuGet package~
https://dotnet.microsoft.com/learn/data/spark-tutorial/install-package
-Add data file~
https://dotnet.microsoft.com/learn/data/spark-tutorial/data
-Code your app~
https://dotnet.microsoft.com/learn/data/spark-tutorial/code
-Run your app~
https://dotnet.microsoft.com/learn/data/spark-tutorial/run

***[[.NET for Apache Spark ガイド>.NET for Apache Spark#w086a731]] [#zd2d65ee]
のチュートリアル部
***[[Microsoft Docs > .NET for Apache Spark ガイド>.NET for Apache Spark#w086a731]] [#zd2d65ee]
-チュートリアル

-.NET for Apache Spark の概要(作業開始)~
--.NET for Apache Spark の概要(作業開始)~
(≒ [[Get started in 10 minutes>#g7fce881]])~
https://docs.microsoft.com/ja-jp/dotnet/spark/tutorials/get-started

-その他のチュートリアル
--その他のチュートリアル
.NET for Apache Spark~
--...を使用したバッチ処理のチュートリアル~
---...を使用したバッチ処理のチュートリアル~
https://docs.microsoft.com/ja-jp/dotnet/spark/tutorials/batch-processing
--...を使用した構造化ストリーミングのチュートリアル~
---...を使用した構造化ストリーミングのチュートリアル~
https://docs.microsoft.com/ja-jp/dotnet/spark/tutorials/streaming
--...と ML.NET での感情分析のチュートリアル~
---...と ML.NET での感情分析のチュートリアル~
https://docs.microsoft.com/ja-jp/dotnet/spark/tutorials/ml-sentiment-analysis

-.NET for Apache Spark アプリケーションをデプロイする~
--[[Azure HDInsight>Azure HDInsight#w086a731]]
--[[Azure Databricks>Azure Databricks#qb9ddd3a]]
--.NET for Apache Spark アプリケーションをデプロイする~
---[[Azure HDInsight>Azure HDInsight#w086a731]]
---[[Azure Databricks>Azure Databricks#qb9ddd3a]]

-使い方ガイド
--[[データーへの接続>.NET for Apache Sparkのデータ接続#i96a74c2]]

----
Tags: [[:クラウド]], [[:Azure]], [[:.NET開発]], [[:.NET Core]], [[:.NET Standard]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS