Как создать ссылку на столбец динамически? - PullRequest
0 голосов
/ 01 мая 2018

У меня есть DataFrame df со следующей структурой:

root
 |-- author: array (nullable = true)
 |    |-- element: integer (containsNull = true)
 |-- client: array (nullable = true)
 |    |-- element: integer (containsNull = true)
 |-- outbound_link: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- url: string (nullable = true)

Я запускаю этот код:

val sourceField = "outbound_link" // set automatically
val targetField = "url"           // set automatically
val nodeId = "client"             // set automatically

val result = df.as("df1").join(df.as("df2"),
        $"df1."+sourceField === $"df2."+targetField
        ).groupBy(
          ($"df1."+nodeId).as("nodeId_1"),
          ($"df2."+nodeId).as("nodeId_2")
        )
        .agg(
          count("*") as "value", max($"df1."+timestampField) as "timestamp"
        )
        .toDF("source", "target", "value", "timestamp")

Но я получаю ошибку:

Exception in thread "main" org.apache.spark.sql.AnalysisException: syntax error in attribute name: df1.;

По какой-то причине переменные sourceField и targetField не видны внутри операции join. Эти переменные не являются пустыми и содержат имена полей. Я должен использовать переменные, потому что я определяю их автоматически на предыдущем шаге кода.

1 Ответ

0 голосов
/ 01 мая 2018

Действительно интересный случай. Посмотрите на $"df1."+sourceField и подумайте, когда $"df1." преобразуется в Column по сравнению с конкатенацией "df1."+sourceField.

scala> val sourceField = "id"
sourceField: String = id

scala> $"df1."+sourceField
org.apache.spark.sql.AnalysisException: syntax error in attribute name: df1.;
  at org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute$.e$1(unresolved.scala:151)
  at org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute$.parseAttributeName(unresolved.scala:170)
  at org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute$.quotedString(unresolved.scala:142)
  at org.apache.spark.sql.Column.<init>(Column.scala:137)
  at org.apache.spark.sql.ColumnName.<init>(Column.scala:1203)
  at org.apache.spark.sql.SQLImplicits$StringToColumn.$(SQLImplicits.scala:45)
  ... 55 elided

Замените $"df1."+sourceField на функции col или column, и все будет в порядке.

scala> col(s"df1.$sourceField")
res7: org.apache.spark.sql.Column = df1.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...