Как преобразовать элемент массива в Map [String, String] в spark 2.2 с Java - PullRequest
0 голосов
/ 03 июня 2018

Я использую spark 2.2 и java 1.8

образец XML-формата -

         <?xml version="1.0" encoding="UTF-8" ?>
         <!-- Generated by Oracle DVM Editor version 1.0 at [9/6/11 5:14 PM]. 
         -->
      <dvm name="CIHSubscriptionTypeMapping" xmlns="http://xmlns.oracle.com/dvm">
       <description>
      </description>
     <columns>
       <column name="SSPMW"/>
       <column name="CIH"/>
      </columns>
    <rows>   

      <row>
        <cell>ute.recordClass</cell>
        <cell>sku_type</cell>
      </row>    
      <row>
        <cell>ute.name.en</cell>
        <cell>name_en</cell>
      </row>

     </rows>
 </dvm>

Чтение XML-файла в spark с API Java -

Dataset<Row> xmlDF =spark.read()
    .format("com.databricks.spark.xml")
    .options("rowTag","row")
    .load("sample.xml");



xmlDF.printSchema()

root
 |-- cell: array (nullable = true)
 |    |-- element: string (containsNull = true)


xmlDF.show(false)


cell
================
         [ute.recordClass, sku_type] 
         [ute.name.en, name_en]  

Я хочупреобразуйте вышеприведенный столбец «ячейка» в карту поиска (String, String) и позже будет использовать его для трансляции.

Пример - (ute.sku.price, list_price) ......

Может ли кто-нибудь помочь в этом? Спасибо.

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете использовать map встроенную функцию как

import org.apache.spark.sql.*;

xmlDF.select(functions.map(functions.col("cell").getItem(0), functions.col("cell").getItem(1)).as("cell")).show(false);

, которая должна дать вам

+-----------------------------+
|cell                         |
+-----------------------------+
|[ute.recordClass -> sku_type]|
|[ute.name.en -> name_en]     |
+-----------------------------+

root
 |-- cell: map (nullable = false)
 |    |-- key: string
 |    |-- value: string (valueContainsNull = true)

Обновление

Вы прокомментировали какВы хотите всего лишь карту Java .Для этого вы можете использовать следующий метод

    List<Row> rows = xmlDF.select(functions.col("cell").getItem(0).as("key"), functions.col("cell").getItem(1).as("value")).collectAsList();
    Map<String, String> hashMap = new HashMap<String, String>();
    for(Row row : rows){
        hashMap.put(row.getString(0), row.getString(1));
    }

hashMap - это карта Java.

Надеюсь, что ответ полезен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...