У меня есть CSV-файл, который содержит данные типа карты и данные типа массива в соответствующих столбцах. Я пытаюсь создать фрейм данных в SparkSQL, но он выдает ошибку о том, что неподдерживаемый тип карты и массив. Я пробовал это в Spark 1.6.3 и Spark 2.2.1. Вот код:
Spark1.6.3:
pyspark --packages com.databricks:spark-csv_2.10:1.5.0
from pyspark.sql import SQLContext
from pyspark.sql.types import *
sqlContext=SQLContext(sc)
customSchema=StructType([StructField("eid",StringType(),True),StructField("username",StringType(),True),StructField("shipping_address",MapType(StringType(), StringType(), True),True),StructField("email_address",StringType(),True),StructField("phone_number",StringType(),True),StructField("ip_address",StringType(),True),StructField("payment_mode",StringType(),True),StructField("billing_amount",IntegerType(),True),StructField("product_details",ArrayType(StringType(),True),True)])
df1 = sqlContext.read.format('com.databricks.spark.csv').options(header='true').load('/data/ordersdata.csv',schema=customSchema)
df1.show()//when I run this command I get an error:"Unsupported type: map"
Spark 2.21:
from pyspark.sql import SQLContext
from pyspark.sql.types import *
sqlContext=SQLContext(sc)
customSchema=StructType([StructField("eid",StringType(),True),StructField("username",StringType(),True),StructField("shipping_address",MapType(StringType(), StringType(), True),True),StructField("email_address",StringType(),True),StructField("phone_number",StringType(),True),StructField("ip_address",StringType(),True),StructField("payment_mode",StringType(),True),StructField("billing_amount",IntegerType(),True),StructField("product_details",ArrayType(StringType(),True),True)])
df2=spark.read.csv("/data/ordersdata.csv", schema=customSchema, header='true')
df2.show() //when I run this command I get an error:"Unsupported type: map"
На самом деле мое требование состоит в том, чтобы извлечь пары ключ-значение из столбца типа карты в CSV-файле и создать новые столбцы с ключами в качестве заголовков столбцов и сохранить соответствующие значения в них в одном и том же кадре данных. Например, данные карты в файле CSV выглядят так:
{"address_line":"Ridge 2897","zip_code":"15201","city":"Pittsburgh","state":"Pennsylvania","phone_no":"9832901309"}
Теперь я хочу создать столбцы, как показано ниже, и добавить их в основной фрейм данных, который создается с использованием файла CSV.
address_line | zip_code | city | state | phone_no
Ridge 2897 | 15201 | Pittsburgh | Pennsylvania | 9832901309