所以,我在创造一个 dataframe
从xml文件。它有一些关于经销商的信息,然后经销商有多辆车-每辆车都是系统的一个子元素 cars
元素,并由 value
元素-每个 cars.value
元素具有各种汽车属性。所以我用一个 explode
函数为经销商的每辆车创建一行,如下所示:
exploded_dealer = df.select('dealer_id',explode('cars.value').alias('a_car'))
现在我想得到 cars.value
我是这样做的:
car_details_df = exploded_dealer.select('dealer_id','a_car.attribute1','a_car.attribute2')
这很管用。但有时 cars.value
元素没有我在查询中指定的所有属性。举个例子 cars.value
元素可能只有attribute1—然后在运行上述代码时会出现以下错误:
pyspark.sql.utils.analysisexception:u“无法解析给定输入列的'attribute2':[dealer_id,attribute1];”
我如何要求spark执行相同的查询。但还是回来吧 None
如果属性2不存在?
更新我的数据如下:
initial_file_df = sqlContext.read.format('com.databricks.spark.xml').options(rowTag='dealer').load('<xml file location>')
exploded_dealer = df.select('financial_data',explode('cars.value').alias('a_car'))
1条答案
按热度按时间dxxyhpgq1#
既然您已经对模式做出了特定的假设,那么最好的方法就是使用
nullable
可选字段,并在导入数据时使用它。假设您希望文档类似于:
哪里
attribute1
,attribute2
, ...,attributebN
可能不存在于给定的批中,但您可以定义一组有限的选项和相应的类型。为了简单起见,假设只有两种选择:您可以将架构定义为:
与reader一起使用:
它对属性的任何子集都有效({∅, {属性1},{attribute2},{attribute1,attribute2})。同时比依赖模式推理更有效。