Как добавить столбцы в фрейм данных без использования withcolumn - PullRequest
0 голосов
/ 28 марта 2019

Мне нужно перебрать json-файл, сгладить результаты и добавить столбец данных в каждый цикл с соответствующими значениями.Но конечный результат будет иметь около 2000 столбцов.Таким образом, использование withColumn для добавления столбцов является чрезвычайно медленным.Есть ли другая альтернатива для добавления столбцов в фрейм данных?

Пример ввода json:

[
  {
    "ID": "12345",
    "Timestamp": "20140101",
    "Usefulness": "Yes",
    "Code": [
      {
        "event1": "A",
        "result": "1"
      }
    ]
  },
  {
    "ID": "1A35B",
    "Timestamp": "20140102",
    "Usefulness": "No",
    "Code": [
      {
        "event1": "B",
        "result": "1"
      }
    ]
  }
]

Мой вывод должен быть:


ID     Timestamp  Usefulness  Code_event1  Code_result

12345  20140101   Yes          A           1
1A35B  20140102   No           B           1 

Файл json Яработа огромна и состоит из множества столбцов.Итак, withColumn в моем случае неосуществимо.

РЕДАКТИРОВАТЬ:

Пример кода:

# Data file
df_data = spark.read.json(file_path)  

# Schema file
with open(schemapath) as fh:
    jsonschema = json.load(fh,object_pairs_hook=OrderedDict)

Я перебираю файл схемы и в цикле, к которому я обращаюсьданные для конкретного ключа из данных DF (df_data).Я делаю это потому, что в моем файле данных есть несколько записей, поэтому я не могу перебрать файл json данных, или он будет перебирать каждую запись.

def func_structs(json_file):
    for index,(k,v) in enumerate(json_file.items()):
        if isinstance(v, dict):
           srccol = k
           func_structs(v)
        elif isinstance(v, list):
           srccol = k
           func_lists(v) # Separate function to loop through list elements to find nested elements
        else:
            try:
                df_data = df_data.withColumn(srcColName,df_Data[srcCol])
            except:
                df_data = df_data.withColumn(srcColName,lit(None).cast(StringType()))

func_structs(jsonschema)

Я добавляю столбцы в сам DF данных (df_data).

1 Ответ

0 голосов
/ 28 марта 2019

Одним из способов является использование встроенного в Spark парсера json для считывания JSON в DF:

df = (sqlContext
      .read
      .option("multiLine", True)
      .option("mode", "PERMISSIVE")
      .json('file:///mypath/file.json')) # change as necessary

Результат выглядит следующим образом:

+--------+-----+---------+----------+
|    Code|   ID|Timestamp|Usefulness|
+--------+-----+---------+----------+
|[[A, 1]]|12345| 20140101|       Yes|
|[[B, 1]]|1A35B| 20140102|        No|
+--------+-----+---------+----------+

ВторойЗатем нужно выделить структуру внутри столбца Code:

df = df.withColumn('Code_event1', f.col('Code').getItem(0).getItem('event1'))
df = df.withColumn('Code_result', f.col('Code').getItem(0).getItem('result'))
df.show()

, что дает

+--------+-----+---------+----------+-----------+-----------+
|    Code|   ID|Timestamp|Usefulness|Code_event1|Code_result|
+--------+-----+---------+----------+-----------+-----------+
|[[A, 1]]|12345| 20140101|       Yes|          A|          1|
|[[B, 1]]|1A35B| 20140102|        No|          B|          1|
+--------+-----+---------+----------+-----------+-----------+

РЕДАКТИРОВАТЬ:

На основе комментария ниже @paultВот более удобный способ получения требуемых значений (запустите этот код после оператора load):

df = df.withColumn('Code', f.explode('Code'))
df.select("*", "Code.*")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...