XML ファイル

Spark SQL は、XML 形式のファイルまたはディレクトリのファイルを Spark DataFrame に読み込むために spark.read().xml("file_1_path","file_2_path") を、xml ファイルに書き込むために dataframe.write().xml("path") を提供します。rowTag オプションは、DataFrame の行 にマッピングされる XML 要素を示すために指定する必要があります。option() 関数は、XML 属性、XSD 検証、圧縮などの読み書きの動作を制御するために使用できます。

# Primitive types (Int, String, etc) and Product types (case classes) encoders are
# supported by importing this when creating a Dataset.
# An XML dataset is pointed to by path.
# The path can be either a single xml file or more xml files
path = "examples/src/main/resources/people.xml"
peopleDF = spark.read.option("rowTag", "person").format("xml").load(path)

# The inferred schema can be visualized using the printSchema() method
peopleDF.printSchema()
# root
#  |-- age: long (nullable = true)
#  |-- name: string (nullable = true)

# Creates a temporary view using the DataFrame
peopleDF.createOrReplaceTempView("people")

# SQL statements can be run by using the sql methods provided by spark
teenagerNamesDF = spark.sql("SELECT name FROM people WHERE age BETWEEN 13 AND 19")
teenagerNamesDF.show()
# +------+
# |  name|
# +------+
# |Justin|
# +------+

# Alternatively, a DataFrame can be created for an XML dataset represented by a Dataset[String]
xmlStrings = ["""
      <person>
          <name>laglangyue</name>
          <job>Developer</job>
          <age>28</age>
      </person>
    """]
xmlRDD = spark.sparkContext.parallelize(xmlStrings)
otherPeople = spark.read \
    .option("rowTag", "person") \
    .xml(xmlRDD)
otherPeople.show()
# +---+---------+----------+
# |age|      job|      name|
# +---+---------+----------+
# | 28|Developer|laglangyue|
# +---+---------+----------+
完全なサンプルコードは、Sparkリポジトリの「examples/src/main/python/sql/datasource.py」にあります。
// Primitive types (Int, String, etc) and Product types (case classes) encoders are
// supported by importing this when creating a Dataset.
import spark.implicits._
// An XML dataset is pointed to by path.
// The path can be either a single xml file or more xml files
val path = "examples/src/main/resources/people.xml"
val peopleDF = spark.read.option("rowTag", "person").xml(path)

// The inferred schema can be visualized using the printSchema() method
peopleDF.printSchema()
// root
//  |-- age: long (nullable = true)
//  |-- name: string (nullable = true)

// Creates a temporary view using the DataFrame
peopleDF.createOrReplaceTempView("people")

// SQL statements can be run by using the sql methods provided by spark
val teenagerNamesDF = spark.sql("SELECT name FROM people WHERE age BETWEEN 13 AND 19")
teenagerNamesDF.show()
// +------+
// |  name|
// +------+
// |Justin|
// +------+

// Alternatively, a DataFrame can be created for a XML dataset represented by a Dataset[String]
val otherPeopleDataset = spark.createDataset(
  """
    |<person>
    |    <name>laglangyue</name>
    |    <job>Developer</job>
    |    <age>28</age>
    |</person>
    |""".stripMargin :: Nil)
val otherPeople = spark.read
  .option("rowTag", "person")
  .xml(otherPeopleDataset)
otherPeople.show()
// +---+---------+----------+
// |age|      job|      name|
// +---+---------+----------+
// | 28|Developer|laglangyue|
// +---+---------+----------+
完全なサンプルコードは、Sparkリポジトリの「examples/src/main/scala/org/apache/spark/examples/sql/SQLDataSourceExample.scala」にあります。
// Primitive types (Int, String, etc) and Product types (case classes) encoders are
// supported by importing this when creating a Dataset.

// An XML dataset is pointed to by path.
// The path can be either a single xml file or more xml files
String path = "examples/src/main/resources/people.xml";
Dataset<Row> peopleDF = spark.read().option("rowTag", "person").xml(path);

// The inferred schema can be visualized using the printSchema() method
peopleDF.printSchema();
// root
//  |-- age: long (nullable = true)
//  |-- name: string (nullable = true)

// Creates a temporary view using the DataFrame
peopleDF.createOrReplaceTempView("people");

// SQL statements can be run by using the sql methods provided by spark
Dataset<Row> teenagerNamesDF = spark.sql(
        "SELECT name FROM people WHERE age BETWEEN 13 AND 19");
teenagerNamesDF.show();
// +------+
// |  name|
// +------+
// |Justin|
// +------+

// Alternatively, a DataFrame can be created for an XML dataset represented by a Dataset[String]
List<String> xmlData = Collections.singletonList(
        "<person>" +
        "<name>laglangyue</name><job>Developer</job><age>28</age>" +
        "</person>");
Dataset<String> otherPeopleDataset = spark.createDataset(Lists.newArrayList(xmlData),
        Encoders.STRING());

Dataset<Row> otherPeople = spark.read()
    .option("rowTag", "person")
    .xml(otherPeopleDataset);
otherPeople.show();
// +---+---------+----------+
// |age|      job|      name|
// +---+---------+----------+
// | 28|Developer|laglangyue|
// +---+---------+----------+
完全なサンプルコードは、Sparkリポジトリの「examples/src/main/java/org/apache/spark/examples/sql/JavaSQLDataSourceExample.java」にあります。

データソースオプション

XML のデータソース オプションは、以下から設定できます。

プロパティ名デフォルト意味スコープ
rowTag 行として扱う xml ファイルの行タグ。たとえば、この xml: <books><book></book>...</books> では、適切な値は book です。これは読み書きの両方で必須のオプションです。 読み書き
samplingRatio 1.0 スキーマ推論に使用される行の割合を定義します。XML の組み込み関数は、このオプションを無視します。 読み込み
excludeAttribute false 要素内の属性を除外するかどうか。 読み込み
mode PERMISSIVE 解析中の破損したレコードを処理するためのモードを許可します。
  • PERMISSIVE: 破損したレコードに遭遇した場合、不正な文字列を columnNameOfCorruptRecord で設定されたフィールドに入れ、不正なフィールドを null に設定します。破損したレコードを保持するために、ユーザーはユーザー定義スキーマに columnNameOfCorruptRecord という名前の文字列型フィールドを設定できます。スキーマにそのフィールドがない場合、解析中に破損したレコードはドロップされます。スキーマを推論する場合、出力スキーマに columnNameOfCorruptRecord フィールドが暗黙的に追加されます。
  • DROPMALFORMED: 破損したレコード全体を無視します。このモードは XML の組み込み関数ではサポートされていません。
  • FAILFAST: 破損したレコードに遭遇した場合、例外をスローします。
読み込み
inferSchema true true の場合、各結果の DataFrame 列に適切な型を推論しようとします。false の場合、すべての結果の列は文字列型になります。 読み込み
columnNameOfCorruptRecord spark.sql.columnNameOfCorruptRecord PERMISSIVE モードによって作成された不正な文字列を持つ新しいフィールドの名前を変更できます。 読み込み
attributePrefix _ 属性を要素と区別するための属性のプレフィックス。これはフィールド名のプレフィックスになります。XML の読み込み時には空にできますが、書き込み時にはできません。 読み書き
valueTag _VALUE 子を持たない要素に属性がある場合の値に使用されるタグ。 読み書き
encoding UTF-8 読み込み時: 指定されたエンコーディング タイプで XML ファイルをデコードします。書き込み時: 保存される XML ファイルのエンコーディング(文字セット)を指定します。XML の組み込み関数は、このオプションを無視します。 読み書き
ignoreSurroundingSpaces true 読み取られる値の周囲の空白をスキップするかどうかを定義します。 読み込み
rowValidationXSDPath null 各行を個別に検証するために使用されるオプションの XSD ファイルへのパス。検証に失敗した行は、上記のエラー解析と同様に扱われます。XSD は、提供されたスキーマまたは推論されたスキーマにそれ以外の影響を与えません。 読み込み
ignoreNamespace false true の場合、XML 要素および属性の名前空間プレフィックスは無視されます。たとえば、<abc:author> と <def:author> は、どちらも単に <author> として扱われます。現時点では、名前空間は rowTag 要素では無視できません。子要素のみが対象となります。XML 解析は、false の場合でも一般に名前空間を認識しません。 読み込み
timeZone (spark.sql.session.timeZone 設定の値) XML データソースまたはパーティション値のタイムスタンプをフォーマットするために使用されるタイムゾーン ID を示す文字列を設定します。次のタイムゾーン形式がサポートされています。
  • 地域ベースのゾーン ID: 「area/city」(例: 「America/Los_Angeles」)の形式である必要があります。
  • ゾーンオフセット: '(+|-)HH:mm' の形式である必要があります。たとえば、'-08:00' または '+01:00' です。また、'UTC' と 'Z' は '+00:00' のエイリアスとしてサポートされています。
「CST」などのその他の短い名前は、曖昧になる可能性があるため、使用しないことをお勧めします。
読み書き
timestampFormat yyyy-MM-dd'T'HH:mm:ss[.SSS][XXX] タイムスタンプの形式を示す文字列を設定します。カスタム日付形式は、 datetime pattern の形式に従います。これはタイムスタンプ型に適用されます。 読み書き
timestampNTZFormat yyyy-MM-dd'T'HH:mm:ss[.SSS] タイムゾーンなしのタイムスタンプを示す文字列を設定します。カスタム日付フォーマットは、Datetime Patterns のフォーマットに従います。これはタイムゾーンなしの timestamp 型に適用されます。注意: このデータ型を書き込んだり読み込んだりする際には、ゾーンオフセットおよびタイムゾーンコンポーネントはサポートされていません。 読み書き
dateFormat yyyy-MM-dd 日付の形式を示す文字列を設定します。カスタム日付形式は、 datetime pattern の形式に従います。これは日付型に適用されます。 読み書き
locale en-US IETF BCP 47 形式の言語タグとしてロケールを設定します。たとえば、ロケールは日付とタイムスタンプの解析中に使用されます。 読み書き
rootTag ROWS xml ファイルのルートタグ。たとえば、この xml: <books><book></book>...</books> では、適切な値は books です。'books' のような値を指定することで、基本的な属性を含めることができます。 書き込み
declaration version="1.0" encoding="UTF-8" standalone="yes" ルートタグの前に、各出力 XML ファイルの先頭に書き込む XML 宣言の内容。たとえば、foo という値はが書き込まれる原因となります。抑制するには空文字列に設定します。 書き込み
arrayElementName item 書き込み時に配列値の列の各要素を囲む XML 要素の名前。 書き込み
nullValue null null 値の文字列表現を設定します。デフォルトは文字列 null です。これが null の場合、フィールドの属性と要素は書き込まれません。 読み書き
wildcardColName xs_any 提供されたスキーマに存在する列の名前で、「ワイルドカード」として解釈されます。文字列型または文字列の配列型である必要があります。スキーマによってそれ以外に一致しない任意の XML 子要素に一致します。子要素の XML は、列の文字列値になります。配列の場合、一致しないすべての要素は文字列の配列として返されます。その名前が示すように、XSD の xs:any 型をエミュレートすることを目的としています。 読み込み
compression none ファイルへの保存時に使用する圧縮コーデック。これは、既知のケースインセンシティブな短縮名(none、bzip2、gzip、lz4、snappy、deflate)のいずれかになります。XML の組み込み関数は、このオプションを無視します。 書き込み
validateName true true の場合、XML 要素名の検証に失敗した場合にエラーをスローします。たとえば、SQL フィールド名にはスペースを含めることができますが、XML 要素名には含めることはできません。 書き込み

その他の一般的なオプションについては、 Generic File Source Options を参照してください。