Download data from the internet | Databricks on AWS [2023/1/25時点]の翻訳です。
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
公開URLからデータをお使いのクラスタードライバーにアタッチされているボリュームストレージにダウンロードするためのDatabricksノートブックを活用することができます。クラウドオブジェクトストレージからデータにアクセスしている場合には、Apache Sparkを用いて直接データにアクセスすることでより良い結果を得ることができます。
Databricksクラスターは汎用計算資源を提供するので、Apache Sparkコマンドに加えて任意のコードを実行することができます。任意のコードはDBFSルートではなく、クラスターのルートディレクトリに実行されるので、ダウンロードしたデータをApache Sparkで読み込む前に新たな場所にデータを移動しなくてはなりません。
注意
いくつかのワークスペースでは、公衆インターネットへのアクセスを許可していない場合があります。ネットワークアクセスの拡張が必要かどうかはワークスペース管理者にお問い合わせください。
Bash、Python、Scalaによるファイルのダウンロード
Databricksでは、インターネットからデータをダウンロードするネイティブツールは提供していませんが、サポートされる言語で利用できるオープンソースツールを活用することができます。以下の例では、いくつかのファイルをダウンロードするためにBash、Python、Scalaを使用しています。
%sh curl https://data.cityofnewyork.us/api/views/kk4q-3rt2/rows.csv --output /tmp/curl-subway.csv
import urllib
urllib.request.urlretrieve("https://data.cityofnewyork.us/api/views/kk4q-3rt2/rows.csv", "/tmp/python-subway.csv")
import java.net.URL
import java.io.File
import org.apache.commons.io.FileUtils
FileUtils.copyURLToFile(new URL("https://data.cityofnewyork.us/api/views/kk4q-3rt2/rows.csv"), new File("/tmp/scala-subway.csv"))
これらのファイルはドライバーにアタッチされたボリュームストレージにダウンロードされるので、以下のサンプルのようにこれらのファイルを参照するには%sh
を使います。
%sh ls /tmp/
以下のサンプルのように、ダウンロードしたファイルのコンテンツをプレビューするためにBashコマンドを使うことができます。
%sh head /tmp/curl-subway.csv
dbutilsによるデータの移動
Apache Sparkを用いてデータにアクセスするには、カレントロケーションからデータを移動します。このデータのカレントロケーションは、ドライバーからのみ参照できる揮発的なボリュームストレージです。Databricksは並列にファイルソースからデータをロードするので、ファイルは計算資源のすべてのノードから参照できなくてはなりません。Databricksでは幅広い外部データソースをサポートしていますが、ファイルベースのデータアクセスは通常クラウドオブジェクトストレージへのアクセスを前提としています。
Databricksユーティリティ(dbutils
)を用いることで、ドライバーにアタッチされたボリュームストレージから、アクセスを設定した外部オブジェクトストレージを含むDBFSからアクセスできる他のロケーションにファイルを移動することができます。以下の例では、ワークスペース構築時に設定されたクラウドオブジェクトストレージのロケーションであるDBFSルートに移動しています。
dbutils.fs.mv("file:/tmp/curl-subway.csv", "dbfs:/tmp/subway.csv")
ダウンロードしたデータの読み込み
クラウドオブジェクトストレージにデータを移動すると、いつもと同じようにデータを読み込むことができるようになります。以下のコードでは、DBFSルートに移動されたCSVデータを読み込んでいます。
df = spark.read.format("csv").option("header", True).load("/tmp/subway.csv")
display(df)