Как читать все элементы массива JSON в Scala - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть файл JSON с массивом имен таблиц.Я хочу прочитать, распечатать все эти элементы один за другим и получить количество элементов массива.Как мы можем добиться этого в блокноте данных, используя scala.

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)

dataframe:

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

Я попытался с кодом:

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

, но если я дам table_list [i], гдея итератор, код генерирует ошибку.здесь ожидается числовое значение.

заранее спасибо.

1 Ответ

0 голосов
/ 26 сентября 2019

Я не уверен, хотите ли вы, чтобы значения массива заканчивались отдельными строками или столбцами в одной строке, поэтому ниже приведены оба решения:)

  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|
+----------------+----------+
Столбец для каждого значения:
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, но оно должно быть статически определенным значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...