Как создать список JSON с помощью Pyspark? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь создать файл json со структурой ниже, используя Pyspark.

Целевой выход:

[{
    "Loaded_data": [{
        "Loaded_numeric_columns": ["id", "val"],
        "Loaded_category_columns": ["name", "branch"]
    }],
    "enriched_data": [{
        "enriched_category_columns": ["country__4"],
        "enriched_index_columns": ["id__1", "val__3"]
    }]
}]

Я мог бы создать список для каждого раздела. Пожалуйста, обратитесь ниже код. Я застрял здесь, не могли бы вы помочь.

Пример данных: enter image description here

input_data=spark.read.csv("/tmp/test234.csv",header=True, inferSchema=True)
def is_numeric(data_type):
    return data_type not in ('date', 'string', 'boolean')
def is_nonnumeric(data_type):
    return data_type in ('string')

sub="__"
Loaded_numeric_columns = [name for name, data_type in input_data.dtypes if is_numeric(data_type) and (sub not in name)]
print Loaded_numeric_columns
Loaded_category_columns = [name for name, data_type in input_data.dtypes if is_nonnumeric(data_type) and (sub not in name)]
print Loaded_category_columns
enriched_category_columns = [name for name, data_type in input_data.dtypes if is_nonnumeric(data_type) and (sub in name)]
print enriched_category_columns
enriched_index_columns = [name for name, data_type in input_data.dtypes if is_numeric(data_type) and (sub in name)]
print enriched_index_columns

1 Ответ

0 голосов
/ 09 января 2019

Вы можете просто создать новый тип столбца с помощью struct и array:

from pyspark.sql import functions as F

df.show()

+---+-----+-------+------+----------+-----+-------+
| id|  val|   name|branch|country__4|id__1| val__3|
+---+-----+-------+------+----------+-----+-------+
|  1|67.87|Shankar|     a|         1|67.87|Shankar|
+---+-----+-------+------+----------+-----+-------+



df.select(
  F.struct(
    F.array(F.col("id"), F.col("val")).alias("Loaded_numeric_columns"),
    F.array(F.col("name"), F.col("branch")).alias("Loaded_category_columns"),
  ).alias("Loaded_data"),
  F.struct(
    F.array(F.col("country__4")).alias("enriched_category_columns"),
    F.array(F.col("id__1"), F.col("val__3")).alias("enriched_index_columns"),
  ).alias("enriched_data"),
).printSchema()

root
 |-- Loaded_data: struct (nullable = false)
 |    |-- Loaded_numeric_columns: array (nullable = false)
 |    |    |-- element: double (containsNull = true)
 |    |-- Loaded_category_columns: array (nullable = false)
 |    |    |-- element: string (containsNull = true)
 |-- enriched_data: struct (nullable = false)
 |    |-- enriched_category_columns: array (nullable = false)
 |    |    |-- element: long (containsNull = true)
 |    |-- enriched_index_columns: array (nullable = false)
 |    |    |-- element: string (containsNull = true)
...