Читайте CSV-файл в искре с запятой в полях - PullRequest
0 голосов
/ 11 марта 2020

У меня есть следующие данные, для которых мне нужно подготовить файл схемы для чтения данных в искре.

id, date, producttype, description
1, 02/01/2020,Standard,["ABC, PQR"]
2, 03/02/2020,Standard,["ABC, PQR"]
3, 20/02/2020,Standard,["ABC, PQR"]

Файл схемы, который я подготовил:

COLUMN_ID, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, PRECISION, DATA_SCALE
1, id, NUMBER,,N,38,0
2, date,VARCHAR2,15,N,,
3, producttype, VARCHAR2,10,N,,
4, description, VARCHAR2,15,N,,

Чтобы проверить эти данные в спарк, я использую следующую команду:

val schema_a = StructType(List(StructField("id",IntegerType,true),
StructField("date",StringType,true),
StructField("producttype",StringType,true),
StructField("description",StringType,true)))

Данные помещаются в корзину S3

a_read_schema = 
spark.read.format("csv").option("delimiter","π").schema(schema_a).load("s3://data/202003110000")

Вывод после чтения этого файла, как показано ниже:

a_read_schema.show()

id, date, producttype, description
1, 02/01/2020,Standard,[ABCπ PQR]
2, 03/02/2020,Standard,[ABCπ PQR]
3, 20/02/2020,Standard,[ABCπ PQR]

Как получить описание столбца с запятой в нем?

1 Ответ

0 голосов
/ 12 марта 2020

Полагаю, функции для этого нет. ArrayType, как упомянуто в комментариях, не работает с типом данных csv.

Другой способ - прочитать файл, разделенный запятыми, и затем объединить последние два столбца.

Этого можно достичь в следующим образом:

 val schema_a = StructType(List(StructField("id",StringType,true),
                                StructField("date",StringType,true),
                                StructField("producttype",StringType,true),
                                StructField("description1",StringType,true),
                                StructField("description2",StringType,true)))


spark.read.option("delimiter",",").schema(schema_a)
.csv(your-file-path)
.withColumn("description", concat_ws(",", col("description1"), col("description2")))
.drop("description1", "description2")
.show()
...