回答

收藏

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")
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则