我对Spark和Python还不熟悉——在Jupyter笔记本上工作
假设我有以下XML:
<metadata>
<person>
<personalName>
<surname>The Batmaner</surname>
</personalName>
<personalName>
<surname>Batman</surname>
</personalName>
</person>
</metadata>
我已使用以下方法将其加载到日期框中:
df = spark.read.format("com.databricks.spark.xml").options(rowTag='metadata').load(path)
现在我可以看到df
中的数据了,如果surname==Batman
,我想从<person>
中拉出整个部分
基本上,我对2位感到困惑:
struct
或重复块的情况下搜索,在我的例子中是多个personalName
<person>
级别返回所有内容任何帮助都将不胜感激
谢谢
在我看到的之后,你的可处理实体应该是
metadata > person > personalName
,因为超人和蝙蝠侠不是同一个英雄,对吧?如果是这样,当您将metadata
指定为rowTag
时,Spark将metadata
下的所有内容转换为具有以下架构的行:当您将rowTag更改为
personalName
时,您将得到以下模式:如果仍然是这样,则预期的模式应该位于
metadata
,您应该使用Apache Spark SQL array functions对行进行操作,例如:应返回:
您可以在这里找到一个非常好的sparksql数组函数列表:Querying Spark SQL DataFrame with complex types
更新
为此,可以使用apachespark的高阶函数和数组函数。如果你搜索
spark higher order function
,你会发现很多关于他们的博客文章和文档。上面我给了你一个关于过滤数组的例子这取决于你的模式。使用
rowTag=metadata
,Spark返回一个由单个字段组成的行,该字段是一个名为person
的结构,仅由一个数组personalName
组成。如果在其中添加了更多字段,则仍然可以查询:使用:
结果将是:
否则,如果将指针移到
person
,您的模式将丢失一个级别,因此编写查询将更容易:对于这样的架构和数据:
相关问题 更多 >
编程相关推荐