Создание таблицы БД MapR с использованием вложенного фрейма данных с массивами - PySpark - PullRequest
0 голосов
/ 05 февраля 2020

Мне нужно превратить приведенный ниже CSV-файл в таблицу MapR DB JSON с вложенной структурой, используя pySpark. На практике мне нужно будет использовать несколько файлов для создания таблицы. Файлы очень похожи, но могут варьироваться в зависимости от количества «проблемных» столбцов, которые они содержат. Я хотел бы, чтобы эти столбцы представляли собой массив переменной длины, различный для каждого вложенного документа.

CSV Пример:

_id, student_name, test_name, test_version, test_score, test_date, problem1, problem2, problem3
10001, Jane, geo_101_1, 2, .86, 10-31-2019, 2, 4, 5
10009, Tarzan, geo_101_1, 2, .66, 10-31-2019, 7, 9, 11 

JSON DOCS:

'[
   {“student_id”: “10001", 
    “student_name”:”Jone”,
    “Scores”: 
            [{“test_name”: “geo_101_1”, 
              “test_version”: “2”,     
              “test_score”: “.86”,
              “test_date”: “10-31-2019”,
              “Incorrect_problems”: [“2”, “4”, “5”]}, 

             {“test_name”: “calc_200_2”, 
              “test_version”: “1”,     
              “test_score”: “.70”,
              “test_date”: “10-31-2019”,
              “Incorrect_problems”: [“3”, “9”]}, 

   }, 
    {“student_id”: “10009”, 
    “student_name”:”Tarzan”,
    “Scores”: 
            [{“test_name”: “geo_101_1”, 
              “test_version”: “2”,     
              “test_score”: “.66”,
              “test_date”: “10-31-2019”,
              “Incorrect_problems”: [“1”, “3”, “4”]}, 

             {“test_name”: “calc_200_2”, 
              “test_version”: “2”,     
              “test_score”: “.75”,
              “test_date”: “10-31-2019”,
              “Incorrect_problems”: [“2”, “3”]}, 

]

Я переместил CSV в фрейм данных и смог получить фрейм данных в нужную мне схему.

df_nested_new.printSchema()

  root
     |-- student_id: string (nullable = true)
     |-- scores: array (nullable = true)
     |    |-- element: struct (containsNull = true)
     |    |    |-- test_name: string (nullable = true)
     |    |    |-- test_version: string (nullable = true)
     |    |    |-- test_score: string (nullable = true)
     |    |    |-- test_date: string (nullable = true)
     |    |    |-- incorrect_problems: array (nullable = false)
     |    |    |    |-- element: string (containsNull = true)

Но когда я запускаю spark.saveToMapRDB, я получаю ниже неописанная ошибка. Похоже, я не могу создать любую таблицу MaprDB из кадра данных, который содержит массив. Это известное ограничение какого-то рода? Есть идеи?

spark.saveToMapRDB(df_nested_new, "nested_test_scores", create_table=True, id_field_path = "student_id")

Py4JJavaError: Произошла ошибка при вызове o65.saveToMapRDB. : org. apache .spark.SparkException: задание прервано из-за сбоя этапа: задание 4 на этапе 18.0 не выполнено 4 раза, последний сбой: потерянное задание 4.3 на этапе 18.0 (TID 266, имя_экземпляра, исполнитель 8): java .lang.NullPointerException

Я также попытался загрузить rdd в таблицу. Но, похоже, rrd -> maprdb не поддерживается в python.

...