web-dev-qa-db-ja.com

expr()でのlit()の使用

この線:

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

期待どおりに動作しますが

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

次の例外が生成されます。

org.Apache.spark.sql.AnalysisException:未定義の関数: 'lit'。この関数は、データベースの「デフォルト」に登録されている登録済み一時関数でも永続的関数でもありません。; org.Apache.spark.sql.catalyst.analysis.Analyzer $ LookupFunctions $$ anonfun $ apply $ 15 $$ anonfun $ applyOrElse $ 49.apply(Analyzer.scala:1198)の行1の位置12

どうして?そして、回避策は何でしょうか?

6
Kyunam

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を使用する必要があります。