概要
Databricks では to_json 関数を利用する際には NULL のカラムを保持する方法を共有します。to_json 関数を実行する際にはignoreNullFields
オプション(デフォルト値がtrue
)の設定により NULL のカラムは喪失するため、NULL のカラムを保持したい場合には、ignoreNullFields
オプションをfalse
に設定する必要があります。
引用元:JSON Files - Spark 3.5.1 Documentation (apache.org)
ignoreNullFields
オプションは、Spark Conf のspark.sql.jsonGenerator.ignoreNullFields
の値に依存し、spark.sql.jsonGenerator.ignoreNullFields
のデフォルトがtrue
であるため、ignoreNullFields
オプションのデフォルト値がtrue
となります。
spark.conf.get("spark.sql.jsonGenerator.ignoreNullFields")
引用元:Configuration - Spark 3.5.1 Documentation (apache.org)
Spark Dataframe 操作にて json 形式で書きこむ場合にも同様の事象が発生するため、下記のように Spark Conf を設定することで NULL のカラムを保持できます。
spark.conf.set("spark.sql.jsonGenerator.ignoreNullFields", "false")
検証コードと実行結果
一時テーブルを作成
%sql
CREATE OR REPLACE TEMPORARY VIEW tmp_struct_tbl
AS
SELECT
from_json(
'{
"int_col": 0,
"str_col": "abc",
"null_col": null
}',
'int_col int,
str_col STRING,
null_col STRING'
)
as struct_col
;
SELECT * FROM tmp_struct_tbl;
デフォルトの状態でnull_col
カラムが喪失することを確認
%sql
SELECT
to_json(
struct_col
) as json_str_col
FROM
tmp_struct_tbl
ignoreNullFields
オプションをfalse
に設定してnull_col
カラムが保持されているを確認
%sql
SELECT
to_json(
struct_col,
map('ignoreNullFields', 'false')
) as json_str_col
FROM
tmp_struct_tbl