Вызов статического метода набора данных не работает в Spark Shell

Я новичок в Scala, поэтому заранее прошу прощения, если решение тривиально.

В настоящее время я пытаюсь выполнить запрос в Spark Shell, где я изменяю логический план набора данных. Вот образец моего кода, в котором я борюсь:

import org.apache.spark.sql._

val newPlan = ...
val newDS = Dataset.ofRows(spark, newPlan)

Когда я запускаю это, я получаю следующее сообщение об ошибке:

<console>:41: error: not found: value Dataset
   val newDS = Dataset.ofRows(spark, newPlan)

При попытке указать пакет в объявлении:

scala> val newDS = org.apache.spark.sql.Dataset.ofRows(spark, newPlan)

Я получаю это:

<console>:41: error: object Dataset in package sql cannot be accessed in package org.apache.spark.sql
       val newDS = org.apache.spark.sql.Dataset.ofRows(spark, newPlan)

Я тоже пробовалimport org.apache.spark.sql.Dataset ,import org.apache.spark.sql.Dataset._ илиimport org.apache.spark.sql.Dataset.* но ни один из них не работал.

Я использую Spark 2.1.0. Спасибо заранее за вашу помощь.

Редактировать

Ответ:ofRows методDataset class - это частный метод Scala. Но он доступен из Java из-за автоматического преобразования кода Scala / Java (и появляется в Javadoc). Таким образом, мы технически не должны использовать этот метод, но он случайно доступен через Java API. Я хотел внести изменения в логический план, потому что я пытаюсь реализовать безопасный для выполнения динамический SQL-запрос. Но я постараюсь найти менее хитрый способ достижения этой цели.

# apache-spark apache-spark-sql dataset
Источник
  • 0
    Dataset.ofRows - частный метод. А наборы данных создаются либо путем определения кодировщиков, либо путем определения классов случаев. Это не способ создать набор данных.
  • 0
    Понятно, спасибо. Действительно, я проверил исходный код Spark, и это частный метод. Но он есть в Javadoc, и похоже, что мы можем вызывать его из Java. Кто-нибудь знает, почему это так?
Codelisting
за 0 против
Лучший ответ

Ответ таков: метод ofRows класса Dataset - это частный метод scala. Но он доступен из Java из-за автоматического преобразования кода Scala / Java (и появляется в Javadoc). Таким образом, мы технически не должны использовать этот метод, но он случайно доступен через Java API. Я хотел внести изменения в логический план, потому что пытаюсь реализовать динамический SQL-запрос, безопасный для выполнения инъекций. Но я постараюсь найти менее хитрый способ достижения этой цели.

Codelisting
Популярные категории
На заметку программисту