1. ホーム
  2. scala

[解決済み] expr() での lit() の使用について

2022-02-09 05:34:24

質問

線です。

df.withColumn("test", expr("concat(lon, lat)")) 

は期待通りに動作しますが

df.withColumn("test", expr("concat(lon, lit(','), lat)"))

は次のような例外を生成します。

org.apache.spark.sql.AnalysisException: 未定義関数: 'lit'. この関数は、データベース 'default' に登録された一時的な関数でも恒久的な関数でもありません。 at org.apache.spark.sql.catalyst.analysis.Analyzer$LookupFunctions$$anonfun$apply$15$$anonfun$applyOrElse$49.apply(Analyzer.scala:1198)

なぜ?また、その回避策は何でしょうか?

解決方法は?

の文字列引数は expr は SQL 式としてパースされ、カラムを作成するために使用されます。そのため lit が有効なSQLコマンドでない場合、エラーが発生します。 lit は、Sparkでリテラル値を新しいカラムに変換するために使用されます)。

これを解決するには、単純に lit の部分です。

df.withColumn("test", expr("concat(lon, ',', lat)")) 

または、内蔵のSparkを使用する concat を使用せずに直接 expr :

df.withColumn("test", concat($"lon", lit(","), $"lat"))

から concat 列を引数にとる lit を使用する必要があります。