【问题标题】:how to read all elements of json array in scala如何在scala中读取json数组的所有元素
【发布时间】:2019-10-01 10:29:38
【问题描述】:

我有一个包含表名数组的 json 文件。我想阅读,一一打印所有这些元素并获取数组元素的计数。 我们如何使用 scala 在 databricks 笔记本中实现这一点。

Json 文件:

{
    "application_name": "dca_app",
    "table_list": ["dca_table1", "dca_table2"]
}

我想要什么:

table count = 2 
table1: dca_table1
table2: dca_table2

代码:

val df = spark.read.option("multiline", "true").json("/mnt/config/sample.json")
df.printSchema()
df.show()
val x = df.select("table_list")
print(x)

架构:

root
 |-- application_name: string (nullable = true)
 |-- table_list: array (nullable = true)
 |    |-- element: string (containsNull = true)

数据框:

+----------------+--------------------+
|application_name|          table_list|
+----------------+--------------------+
|         dca_app|[dca_table1, dca_...|
+----------------+--------------------+

我尝试了代码:

val tablelist = df.selectExpr("table_list[0]")
tablelist.show()

但如果我给出 table_list[i],其中 i 是迭代器,代码会产生错误。它在这里需要数值。

提前致谢。

【问题讨论】:

    标签: json scala apache-spark


    【解决方案1】:

    我不确定您是否希望将数组值作为单独的行或作为单行中的列结束,所以下面是两种解决方案:)

    1. 每个数组值的行:
    from pyspark.sql.functions import explode
    df.select("application_name", explode("table_list")).show()
    

    explode 对数组执行此操作,结果:

    +----------------+----------+
    |application_name|       col|
    +----------------+----------+
    |         dca_app|dca_table1|
    |         dca_app|dca_table2|
    +----------------+----------+
    
    1. 每个值的列:
    df.selectExpr(["table_list[%s]" % i for i in range(2)] + ["application_name"]).show()
    
    +-------------+-------------+----------------+
    |table_list[0]|table_list[1]|application_name|
    +-------------+-------------+----------------+
    |   dca_table1|   dca_table2|         dca_app|
    +-------------+-------------+----------------+
    

    如您所见,您实际上可以将列表推导式传递给 selectExpr,但它必须是静态定义的值。

    【讨论】:

    • 谢谢丹尼尔。但我想要 scala 代码,你的建议适用于 Python。
    【解决方案2】:

    以下代码对我有用:

    val df = spark.read.option("multiline", "true").json("/mnt/config/sample.json")
    var arrayList = df.select("table_list").toDF.withColumn("table_list",explode($"table_list")).collectAsList.toArray
    
    for (i <- 0 to (arrayList.length)-1)
    {
      val filename = arrayList(i).toString.replaceAll("[\\[\\]]","")
      println(filename)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多