apache spark
Apache Spark社区为扩展Spark付出了很多努力。 最近,我们希望将XML数据集转换为更易于查询的内容。 我们主要对每天进行的数十亿笔交易之上的数据探索感兴趣。 XML是一种众所周知的格式,但是有时使用起来可能很复杂。 例如,在Apache Hive中,我们可以定义XML模式的结构,然后使用SQL查询它。
但是,我们很难跟上XML结构的更改,因此放弃了先前的选项。 我们正在使用Spark Streaming功能将这些事务带入我们的集群,并且我们正在考虑在Spark中进行所需的转换。 但是,仍然存在相同的问题,因为每次XML结构更改时,我们都必须更改Spark应用程序。
肯定有另一种方式!
有一个来自社区的Apache Spark软件包,我们可以用来解决这些问题。 在此博客文章中,我将指导您如何使用社区中的Apache Spark包将任何XML文件读入DataFrame。
让我们加载Spark shell并查看示例:
./spark-shell — packages com.databricks:spark-xml_2.10:0.3.3
在这里,我们只是将XML包添加到了我们的Spark环境中。 当然,可以在编写Spark应用并将其打包到jar文件中时添加。
使用该包,我们可以将任何XML文件读入DataFrame。 加载DataFrame时,我们可以指定数据的架构,但这首先是我们的主要关注点,因此我们将让Spark进行推断。 DataFrame模式的推断是一个非常强大的技巧,因为我们不再需要知道该模式,因此它可以随时更改。
让我们看看如何将XML文件加载到DataFrame中:
val df = sqlContext.read.format("com.databricks.spark.xml").option("rowTag", "OrderSale").load("~/transactions_xml_folder/")df.printSchema
打印DataFrame架构使我们对推理系统做了什么有所了解。
root|-- @ApplicationVersion: string (nullable = true)|-- @BusinessDate: string (nullable = true)|-- @Change: double (nullable = true)|-- @EmployeeId: long (nullable = true)|-- @EmployeeName: string (nullable = true)|-- @EmployeeUserId: long (nullable = true)|-- @MealLocation: long (nullable = true)|-- @MessageId: string (nullable = true)|-- @OrderNumber: long (nullable = true)|-- @OrderSourceTypeId: long (nullable = true)|-- @PosId: long (nullable = true)|-- @RestaurantType: long (nullable = true)|-- @SatelliteNumber: long (nullable = true)|-- @SpmHostOrderCode: string (nullable = true)|-- @StoreNumber: long (nullable = true)|-- @TaxAmount: double (nullable = true)|-- @TaxExempt: boolean (nullable = true)|-- @TaxInclusiveAmount: double (nullable = true)|-- @TerminalNumber: long (nullable = true)|-- @TimeZoneName: string (nullable = true)|-- @TransactionDate: string (nullable = true)|-- @TransactionId: long (nullable = true)|-- @UTCOffSetMinutes: long (nullable = true)|-- @Version: double (nullable = true)|-- Items: struct (nullable = true)| |-- MenuItem: struct (nullable = true)| | |-- #VALUE: string (nullable = true)| | |-- @AdjustedPrice: double (nullable = true)| | |-- @CategoryDescription: string (nullable = true)| | |-- @DepartmentDescription: string (nullable = true)| | |-- @Description: string (nullable = true)| | |-- @DiscountAmount: double (nullable = true)| | |-- @Id: long (nullable = true)| | |-- @PLU: long (nullable = true)| | |-- @PointsRedeemed: long (nullable = true)| | |-- @Price: double (nullable = true)| | |-- @PriceLessIncTax: double (nullable = true)| | |-- @PriceOverride: boolean (nullable = true)| | |-- @ProductivityUnitQuantity: double (nullable = true)| | |-- @Quantity: long (nullable = true)| | |-- @TaxAmount: double (nullable = true)| | |-- @TaxInclusiveAmount: double (nullable = true)|-- OrderTaxes: struct (nullable = true)| |-- TaxByImposition: struct (nullable = true)| | |-- #VALUE: string (nullable = true)| | |-- @Amount: double (nullable = true)| | |-- @ImpositionId: long (nullable = true)| | |-- @ImpositionName: string (nullable = true)|-- Payments: struct (nullable = true)| |-- Payment: struct (nullable = true)| | |-- #VALUE: string (nullable = true)| | |-- @AccountIDLast4: string (nullable = true
此时,我们可以使用任何SQL工具通过Spark SQL查询XML。 请阅读这篇文章( Apache Spark作为分布式SQL引擎 )以了解有关Spark SQL的更多信息。 更进一步,我们可以使用可以读取JSON格式的数据的工具。 如果您拥有Apache Drill之类的东西,拥有JSON数据集就特别有用。
如果您对使用此Apache Spark软件包将XML文件读入DataFrame有任何疑问,请在下面的评论部分中询问他们。
翻译自: https://www.javacodegeeks.com/2016/08/apache-spark-packages-xml-json.html
apache spark