<p>我使用SparkShell来执行下面的操作,我相信xml结构是重复的。
您需要创建/引用一个与xml文件相关的模式。
你可以利用砖厂的udf罐。
那么</p>
<p>1.创建如下函数</p>
<p><code>sql(""" create temporary function numeric_range as brickhouse.udf.collect.NumericRange""")</code></p>
<p>2.使用模式</p>
<pre><code>var df=sqlContext.read.format("com.databricks.spark.xml").option("rowTag","FileSummary").load("location of schema file")
val schema=df.schema
</code></pre>
<p>3.<code>var df1=sqlContext.read.format("com.databricks.spark.xml").option("rowTag","FileSummary").schema(schema).load("location of actual xml file")</code></p>
^{pr2}$
<p>4.您需要将文件发票展开,如下所示</p>
<pre><code>val df2=sql("select array_index(FileInvoices,n) as FileInvoices from XML_Data lateral view numeric_range(size(FileInvoices))n1 as n""").registerTempTable("xmlData2")
</code></pre>
<p>一旦every被转换为Struct,就更容易遍历或使用<code>FileInvoices.InvoiceHeader.InvoiceHeaderDate</code>进行分解</p>
<pre><code>val jdbcUsername = "<username>"
val jdbcPassword = "<password>"
val jdbcHostname = "<hostname>" //typically, this is in the form or servername.database.windows.net
val jdbcPort = 1433
val jdbcDatabase ="<database>"
val jdbc_url = s"jdbc:sqlserver://${jdbcHostname}:${jdbcPort};database=${jdbcDatabase};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=60;"
val connectionProperties = new Properties()
connectionProperties.put("user", s"${jdbcUsername}")
connectionProperties.put("password", s"${jdbcPassword}")
spark.table("").write.jdbc(jdbc_url, "xmlData2", connectionProperties)
</code></pre>