Python 数组中第n项的SparkSQL sql语法

Python 数组中第n项的SparkSQL sql语法,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我有一个json对象,它不幸地结合了嵌套和数组。因此,如何使用spark sql查询它并不十分明显 下面是一个示例对象: { stuff: [ {a:1,b:2,c:3} ] } 因此,在javascript中,要获取c的值,我需要编写myData.stuff[0].c 在我的spark sql查询中,如果该数组不存在,我可以使用点表示法: SELECT stuff.c FROM blah 但是我不能,因为最里面的对象被包装在一个数组中 我试过: SELECT stuff.0

我有一个json对象,它不幸地结合了嵌套和数组。因此,如何使用spark sql查询它并不十分明显

下面是一个示例对象:

{
  stuff: [
    {a:1,b:2,c:3}
  ]
}
因此,在javascript中,要获取
c
的值,我需要编写
myData.stuff[0].c

在我的spark sql查询中,如果该数组不存在,我可以使用点表示法:

SELECT stuff.c FROM blah
但是我不能,因为最里面的对象被包装在一个数组中

我试过:

SELECT stuff.0.c FROM blah // FAIL
SELECT stuff.[0].c FROM blah // FAIL

那么,选择这些数据的神奇方法是什么呢?还是支持?

不清楚JSON对象是什么意思,所以让我们考虑两种不同的情况:

  • 结构数组

    import tempfile    
    
    path = tempfile.mktemp()
    with open(path, "w") as fw: 
        fw.write('''{"stuff": [{"a": 1, "b": 2, "c": 3}]}''')
    df = sqlContext.read.json(path)
    df.registerTempTable("df")
    
    df.printSchema()
    ## root
    ##  |-- stuff: array (nullable = true)
    ##  |    |-- element: struct (containsNull = true)
    ##  |    |    |-- a: long (nullable = true)
    ##  |    |    |-- b: long (nullable = true)
    ##  |    |    |-- c: long (nullable = true)
    
    sqlContext.sql("SELECT stuff[0].a FROM df").show()
    
    ## +---+
    ## |_c0|
    ## +---+
    ## |  1|
    ## +---+
    
  • 一组地图

    # Note: schema inference from dictionaries has been deprecated
    # don't use this in practice
    df = sc.parallelize([{"stuff": [{"a": 1, "b": 2, "c": 3}]}]).toDF()
    df.registerTempTable("df")
    
    df.printSchema()
    ## root
    ##  |-- stuff: array (nullable = true)
    ##  |    |-- element: map (containsNull = true)
    ##  |    |    |-- key: string
    ##  |    |    |-- value: long (valueContainsNull = true)
    
    sqlContext.sql("SELECT stuff[0]['a'] FROM df").show()
    ## +---+
    ## |_c0|
    ## +---+
    ## |  1|
    ## +---+
    

  • 另请参见

    是否有方法覆盖数组的所有元素,例如
    stuff[*]
    ,而不是特定的索引?