PySpark sqlContext JSON查询数组的所有值
技术问答
225 人阅读
|
0 人回复
|
2023-09-14
|
我目前有一个json文件,我正在尝试使用sqlContext.sql()进行查询,如下所示:/ a' T' _; a o7 F' A; u7 X
{. G& C4 E4 I0 A5 L/ U( ]. t+ W; g
"sample": {
2 ]+ E/ F$ d+ n' { "persons": [
+ j, ^6 r% w' p2 b2 q$ s+ y4 g8 E% ~: J {9 v: m( L* t$ K- d' |3 a
"id": "123",1 m X2 E% a8 s! w8 r3 r% p: L
},( w% ^1 N. x. T0 u- l9 P: @
{! Y Z; `, }7 ]; d
"id": "456",- e4 v4 j$ y# {% h
}( t* f; d# l" h' d0 Z5 L
]6 U) X" R% y: n2 P
}
& T& P9 z; K. B8 S* A; t# `}
9 R* ^/ m( d6 n. a! D如果我只想要第一个值,请输入:
" F5 U7 Y! J, bsqlContext.sql("SELECT sample.persons[0] FROM test")
1 {, d( k: N5 w" T但是我想要“人”的所有值而不必编写循环。循环会消耗太多的处理能力,并且鉴于这些文件的大小,这将是不切实际的。
9 V8 T8 p2 x$ ]4 d/ R我以为我可以在[]括号内放一个范围,但是我找不到任何语法可以做到这一点。- i3 s6 ? f3 k9 f" o/ m4 h) H
1 M: c/ i8 M! {! ]/ @* i: _6 C& F
解决方案:
- p( U! H1 C, E3 z! w6 k. h4 Z/ `
7 [6 e& T& ~' T* m. z" a4 B, F) [0 u9 k ~+ W- v3 }7 f
. }$ b9 [; W( W; K- G1 e
如果您的架构如下所示:
% I( L( p* r iroot
5 O: C" T/ M n3 Q |-- sample: struct (nullable = true)
) Z+ r5 F0 y% N) c3 S | |-- persons: array (nullable = true)
. `+ L8 H, I: Z, a$ J | | |-- element: struct (containsNull = true)
" W" N) u: A- |% h! i* D7 v | | | |-- id: string (nullable = true)
8 h( _! \# M' C! Z+ v5 P) H( n C并想要structs从persons数组访问单个对象,您需要做的就是将其爆炸:
- v8 \5 @! z, q+ c/ Hfrom pyspark.sql.functions import explode
x* `$ Y' i2 b Xdf.select(explode("sample.persons").alias("person")).select("person.id") |
|
|
|
|
|