Как преобразовать элемент массива в Map [String, String] в искрах 2.2 с помощью java

Sekhar спросил: 10 мая 2018 в 04:33 в: java

Я использую искру 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-файла в искрах с помощью java API -

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]

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

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

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


1 ответ

Есть решение
Ramesh Maharjan ответил: 11 мая 2018 в 09:20

Вы можете использовать встроенную функцию 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-карта.

Я надеюсь, что ответ будет полезен

Ramesh Maharjan ответил: 11 мая 2018 в 09:21
@Sekhar Я обновил ответ. если ответ будет полезен, подумайте о его принятии
Sekhar ответил: 11 мая 2018 в 06:27
Спасибо Рамешу. Я хочу, чтобы вывести результат только на java-карте. Можете ли вы помочь в этом? .Thx
Sekhar ответил: 13 мая 2018 в 06:59
Спасибо Рамешу за вашу помощь.

Дополнительное видео по вопросу: Как преобразовать элемент массива в Map [String, String] в искрах 2.2 с помощью java

Java SE. Урок 14. Массивы ( java array )

TrueJS 14. Метод map для массивов

Уроки Java - №37 Коллекции. ArrayList.