在读取CSV文件时支持SparkSQL中的Map数据类型

时间:2018-09-01 17:40:22

标签: apache-spark-sql pyspark-sql

我有一个CSV文件,该文件在相应的列中包含Map类型数据和Array类型数据。我正在尝试在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"

火花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

0 个答案:

没有答案