ノートブックから Watson Studio プロジェクトおよびプロジェクト資産と対話する必要がある場合は、 Python用の project-lib
ライブラリーを使用できます。 このライブラリーは、プロジェクトに対するプログラマチック・インターフェースに似ています。
Python用の project-lib
ライブラリーを使用すると、プロジェクトのメタデータと資産 (ファイルや接続など) にアクセスできます。 また、ライブラリーには、プロジェクトに関連付けられたファイルのフェッチを簡素化する関数も含まれています。
注:
project-lib
関数は、ファイルへのデータの保存時またはファイルからのデータの取得時に、データをエンコードまたはデコードしません。project-lib
機能を使用して、接続されているフォルダー資産 ( Cloud Object Storage内のパス上のファイル) にアクセスすることはできません。
ライブラリーの使用
Python 用の project-lib
ライブラリーはプリインストールされており、ノートブック・エディターでノートブックに直接インポートできます。 ノートブックでproject-lib
ライブラリーを使用するには、プロジェクトの ID とプロジェクト・トークンが必要です。
プロジェクト・トークンをノートブックに挿入するには、以下のようにします。
ノートブックのツールバーにある「その他」アイコンをクリックして、「プロジェクト・トークンの挿入」をクリックします。
プロジェクト・トークンが存在している場合、以下の情報が含まれたセルがノートブックに追加されます。
from project_lib import Project project = Project(sc,"<ProjectId>","<ProjectToken>")
sc
は、Spark コンテキストです (Spark が使用されている場合)。<ProjectId>
はプロジェクトの ID であり、<ProjectToken>
はプロジェクト・トークンの値です。プロジェクト・トークンが存在しないというメッセージが表示された場合は、メッセージ内のリンクをクリックして、プロジェクトの「アクセス制御」ページにリダイレクトします。このページで、プロジェクト・トークンを作成できます。 プロジェクト・トークンを作成する資格がなければなりません。 詳しくは、『プロジェクト・トークンの手動での追加』を参照してください。
プロジェクト・トークンを作成するには、以下のようにします。
- 「管理」タブで、「アクセス制御」ページを選択し、「アクセス・トークン」の下の「新規アクセス・トークン」をクリックします。
- 名前を入力し、プロジェクトの「エディター」ロールを選択し、トークンを作成します。
- ノートブックに戻り、ノートブック・ツールバーの「その他」アイコンをクリックして、「プロジェクト・トークンの挿入」をクリックします。
project-lib
関数
project-lib
ライブラリーのインポート後に作成されるインスタンス化されたプロジェクト・オブジェクトは、以下の仕方でグループ化された関数のセットを公開します。
プロジェクト情報のフェッチ
以下の関数を使用して、プロジェクト関連情報をプログラマチックにフェッチできます。
get_name()
この関数は、プロジェクトの名前を返します。
get_description()
この関数は、プロジェクトの説明を返します。
get_metadata()
この関数はプロジェクト・メタデータを返します。
get_storage_metadata()
この関数は、プロジェクトに関連付けられているオブジェクト・ストレージのメタデータを返します。
get_project_bucket_name()
この関数は、関連付けられたオブジェクト・ストレージ内のプロジェクト・バケット名を返します。 すべてのプロジェクト・ファイルは、このバケットに保管されます。
get_files()
この関数は、プロジェクト内のファイルのリストを返します。 返されるリスト内の各要素には、そのファイルの ID と名前が含まれます。 返されるファイルのリストは、どの基準によってもソートされておらず、関数を再度呼び出すときに変更することができます。
get_assets()
この関数は、すべてのプロジェクト資産のリストを返します。 オプション・パラメーター
asset_type
を関数get_assets
に渡すことができます。これにより、タイプによって資産をフィルターに掛けることができます。 このパラメーターに指定できる値は、data_asset
、connection
、およびasset
です。 値asset
は、プロジェクト内のすべての資産を返します。 例えば、データ資産のみを取得するには、関数get_assets("data_asset")
を使用します。get_connections()
この関数は、プロジェクト内にある接続のリストを返します。 返されるリスト内の各要素には、その接続の ID と名前が含まれます。
ファイルのフェッチ
以下の関数を使用して、プロジェクトに関連付けられているオブジェクト・ストレージに保管されているファイルをフェッチできます。
以下の 2 つの方法でファイルをフェッチできます。
get_file_url(file_name)
ここで、file_name
は、フェッチするファイルの名前です。この関数は、Spark を使用してオブジェクト・ストレージからファイルをフェッチするための URL を返します。 この URL は、プロジェクトに関連付けられているオブジェクト・ストレージのタイプに基づいて作成されます。 プロジェクトのオブジェクト・ストレージと対話すると、Hadoop 構成が自動的にセットアップされます。
以下の例では、この関数を使用して、Spark を使用してオブジェクト・ストレージからデータをフェッチする方法を示します。
# Import the lib from project_lib import Project project = Project(sc,"<ProjectId>", "<ProjectToken>") # Get the url url = project.get_file_url("myFile.csv") # Fetch the CSV file from the object storage using Spark from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() df_data_1 = spark.read\ .format('org.apache.spark.sql.execution.datasources.csv.CSVFileFormat')\ .option('header', 'true')\ .load(url) df_data_1.show(5)
get_file(file_name)
ここで、file_name
は、フェッチするファイルの名前です。この関数は、オブジェクト・ストレージからのファイルを実行中のカーネルのメモリーにフェッチします。 この関数はバイト・バッファーを返します。これは、カーネル固有のデータ構造 (pandas DataFrame など) へのバインドに使用できます。 非常に大容量のファイルの場合、この方法でのファイルのフェッチは推奨されません。
次の例は、ファイルをフェッチして、データを pandas DataFrame に読み込む方法を示しています。
# Import the lib from project_lib import Project project = Project(sc,"<ProjectId>", "<ProjectToken>") # Fetch the file my_file = project.get_file("myFile.csv") # Read the CSV data file from the object storage into a pandas DataFrame my_file.seek(0) import pandas as pd pd.read_csv(my_file, nrows=10)
データの保存
次の関数を使用して、プロジェクトに関連付けられたオブジェクト・ストレージにデータを保存できます。 データは、関連付けられている Cloud Object Storage 内のプロジェクト・バケットにファイルとして追加されます。 この関数は複数のことを行います。 最初にデータをオブジェクト・ストレージに入れた後、このデータをデータ資産としてプロジェクトに追加します。これにより、ファイルとして保存したデータを、プロジェクト内のデータ資産リストで確認できるようになります。
save_data(file_name, data, set_project_asset=True, overwrite=False)
この関数は、以下のパラメーターを取ります。
file_name
: 作成されたファイルの名前。data
: アップロードするデータ。 これは、タイプfile-like-object
の任意のオブジェクト (例えば、バイト・バッファーまたはストリング・バッファー) にすることができます。set_project_asset[optional]
: データがオブジェクト・ストレージに正常にアップロードされた後に、ファイルをデータ資産としてプロジェクトに追加します。 これはブール値を取り、デフォルトでは値 true に設定されています。overwrite[optional]
: ファイルがオブジェクト・ストレージまたはプロジェクトに既に存在する場合、そのファイルを上書きします。 デフォルトでは、false に設定されています。
以下の例は、データをオブジェクト・ストレージ内のファイルに保存する方法を示しています。
# Import the lib
from project_lib import Project
project = Project(sc,"<ProjectId>", "<ProjectToken>")
# let's assume you have the pandas DataFrame pandas_df which contains the data
# you want to save in your object storage as a csv file
project.save_data("file_name.csv", pandas_df.to_csv(index=False))
# the function returns a dict which contains the asset_id, bucket_name and file_name
# upon successful saving of the data
接続からのデータの読み取り
次の関数を使用して、任意の接続のメタデータ (資格情報) を取得できます。
get_connection
: この関数は、接続の ID または接続の名前を入力として取ります。 これらの値は、プロジェクトにリストされているすべての資産のid
、name
、およびtype
を返すget_assets()
関数を使用して取得できます。
関数get_connection
は、接続データ・ソースからデータをフェッチするために使用できる接続資格情報を返します。
以下の例は、get_connection
関数を使用して接続の資格情報をフェッチする方法を示しています。
# Import the lib
from project_lib import Project
project = Project(sc,"<ProjectId>", "<ProjectToken>")
conn_creds = project.get_connection(name="<ConnectionName>")
例えば、dashDB への接続の場合、次のコードを実行してデータをフェッチできます。
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
host_url = "jdbc:db2://{}:{}/{}".format(conn_creds["host"], "50000", conn_creds["database"])
data_df = spark.read.jdbc(host_url, table="<TableName>", properties={"user": conn_creds["username"], "password": conn_creds["password"]})
data_df.show()
接続データのフェッチ
次の関数を使用して、接続データの資格情報をフェッチできます。 この関数は、接続内の特定のデータを指すdatapath
属性に加えて、接続資格情報を含むディクショナリーを返します。例えば、dashDB インスタンス内の表や Cloudant インスタンス内のデータベースなどです。
get_connected_data
: この関数は、接続されたデータの ID または接続されたデータの名前を入力として使用します。 これらの値は、プロジェクトにリストされているすべての資産のid
、name
、およびtype
を返すget_assets()
関数を使用して取得できます。
以下の例は、get_connected_data
関数を使用して dashDB インスタンス内の接続されたデータの資格情報をフェッチする方法を示しています。
# Import the lib
from project_lib import Project
project = Project(sc,"<ProjectId>", "<ProjectToken>")
creds = project.get_connected_data(name="<ConnectedDataName>")
# creds is a dictionary that has the connection credentials in addition to
# a datapath that references a specific table in the database
# creds: {'database': 'DB_NAME',
# 'datapath': '/DASH11846/SAMPLE_TABLE',
# 'host': 'dashdb-entry-yp-dal09-07.services.dal.bluemix.net',
# 'password': 'XXXX',
# 'sg_service_url': 'https://sgmanager.ng.bluemix.net',
# 'username': 'XXXX'}
詳細情報
親トピック: ノートブックでのデータのロードとアクセス