1
1

DatabricksにおけるXMLのネイティブサポート

Posted at

こちらのリリースです。

Native XML file format support (Public Preview)

XMLファイルフォーマットのネイティブサポートがパブリックプレビューとなりました。XMLファイルフォーマットのサポートによって、バッチ処理やストリーミングにおけるXMLデータの取り込み、クエリー、パースが買おうとなります。スキーマやデータタイプの自動推定や進化が可能となり、from_xmlのようなSQLエクスプレッションをサポートし、XMLドキュメントを生成します。外部のjarは不要であり、Auto Loader、read_filesCOPY INTO、Delta Live Tablesとシームレスに動作します。詳細については、XMLファイルの読み取りと書き込みをご覧ください。

プレビュー
本機能はパブリックプレビューです。

これまでは、SparkでXMLを取り扱うためには、spark-xmlなどのライブラリが必要でした。ここではネイティブサポートをウォークスルーします。

要件

Databricksランタイム14.3以降が必要です。

XMLレコードのパース

XMLはツリー構造なので、いきなりテーブル形式にできないケースが多いです。なので、データフレームの行に対応するタグを指定するためのオプションが指定されています。それがrowTagオプションです。このオプションでデータフレームの行に対応するタグを指定することができます。

最初にXMLファイルを作成します。以下の例ではbooksタグの配下にbookタグが並んでいるのがわかります。

scala
val xmlString = """
  <books>
    <book id="bk103">
      <author>Corets, Eva</author>
      <title>Maeve Ascendant</title>
    </book>
    <book id="bk104">
      <author>Corets, Eva</author>
      <title>Oberon's Legacy</title>
    </book>
  </books>"""
val xmlPath = "dbfs:/tmp/books.xml"
dbutils.fs.put(xmlPath, xmlString)

ですので、オプションrowTagbooksを指定します。

scala
val df = spark.read.option("rowTag", "books").xml(xmlPath)
df.printSchema()
df.show(truncate=false)

動きました。

root
 |-- book: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- _id: string (nullable = true)
 |    |    |-- author: string (nullable = true)
 |    |    |-- title: string (nullable = true)

+------------------------------------------------------------------------------+
|book                                                                          |
+------------------------------------------------------------------------------+
|[{bk103, Corets, Eva, Maeve Ascendant}, {bk104, Corets, Eva, Oberon's Legacy}]|
+------------------------------------------------------------------------------+

df: org.apache.spark.sql.DataFrame = [book: array<struct<_id:string,author:string,title:string>>]

子要素のbookrowTagに指定します。

scala
val df = spark.read.option("rowTag", "book").xml(xmlPath)
display(df)

各要素がレコードになりました。
Screenshot 2024-02-04 at 17.25.37.png

SQLのサンプル

SQL
DROP TABLE IF EXISTS books;
CREATE TABLE books
USING XML
OPTIONS (path "dbfs:/tmp/books.xml", rowTag "book");
SELECT * FROM books;

Screenshot 2024-02-04 at 17.30.36.png

Pythonのサンプル

Python
df = spark.read.format('xml').options(rowTag='book').load('dbfs:/tmp/books.xml')
(df.select("author", "_id").write
  .options(rowTag='book', rootTag='books')
  .xml('dbfs:/tmp/newbooks.xml')
)
Python
new_df = spark.read.format('xml').options(rowTag='book').load('dbfs:/tmp/newbooks.xml')
display(new_df)

Screenshot 2024-02-04 at 17.32.52.png

はじめてのDatabricks

はじめてのDatabricks

Databricks無料トライアル

Databricks無料トライアル

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1