Можно ли (и как) указать SQL-запрос в командной строке с помощью spark-submit - PullRequest
2 голосов
/ 18 июня 2019

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

def main(args: Array[String]) {
    var dvfFiles : String = "g:/data/gouv/dvf/raw" 
    var q : String = ""
    //q = "SELECT distinct DateMutation, NVoie, IndVoie, Voie, Valeur, CodeTypeLocal, TypeLocal, Commune FROM mutations WHERE Commune = 'ICI' and Valeur > 100000 and CodeTypeLocal in (1, 2) order by Valeur desc"

    args.sliding(2, 2).toList.collect {         
        case Array("--sfiles", argFiles: String) => dvfFiles = argFiles
        case Array("--squery", argQ: String) => q = argQ
    }
    println(s"files from: ${dvfFiles}")

если я запускаю следующую команду:

G:\dev\fromGit\dvf\spark>spark-submit .\target\scala-2.11\dfvqueryer_2.11-1.0.jar \
--squery "SELECT distinct DateMutation, NVoie, IndVoie, Voie, Valeur, CodeTypeLocal, \
TypeLocal, Commune FROM mutations WHERE (Commune = 'ICI') and (Valeur > 100000) and (CodeTypeLocal in (1, 2)) order by Valeur desc"

Я получил следующий результат:

== SQL ==

ВЫБЕРИТЕ различные мутации DateMutation, NVoie, IndVoie, Voie, Valeur, CodeTypeLocal, TypeLocal, Commune FROM, ГДЕ (Commune = 'ICI') и (Valeur и (CodeTypeLocal in (1, 2))). -------------------------------------------------- -------------------------------------------- ^^^

^^^, указывающий FROM

Я также замечаю пропажу > 100000 после Valeur.

запрос правильный, потому что, если я раскомментирую //q =..., упакую код и отправлю его, все будет хорошо.

1 Ответ

2 голосов
/ 18 июня 2019

Кажется, что процесс записывает часть запроса во время ввода.Одним из решений этой проблемы было бы отправить весь аргумент выбранного вами запроса в одну строку и ввести его в строковое значение.В этом формате он может быть немедленно передан в функцию sql для запуска вашего запроса.Ниже описано, как вы можете построить функцию:

//The Package Tree
package stack.overFlow 

//Call all needed packages 
import org.apache.spark.sql.{DataFrame, SparkSession, Column, SQLContext} 
import org.apache.spark.SparkContext 
import org.apache.spark.sql.functions._ 
import org.apache.spark.sql.types._ 
import org.apache.spark.sql  

//Object Name
object demoCode {
  def main(args: Array[String]) {
    ///Build the contexts 
    var spark = SparkSession.builder.enableHiveSupport().getOrCreate() 
    var sc = spark.sparkContext 
    val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
    import sqlContext.implicits._ 

    //Set the query as a string for argument 1
    val commandQuery : String = args(0)

    //Pass query to the sql function
    val inputDF = spark.sql(commandQuery)
  }
}

Когда функция скомпилируется, вам понадобятся два объекта (1) Jar, а также (2) дерево пакетов и класс для запуска функции.При запуске бота из --class все, что вам нужно сделать, это включить пробел и пройти через SQL-запрос, чтобы во время выполнения он был загружен в сеанс spark.

spark-submit --class stack.overFlow.demoCode /home/user/demo_code/target/demoCode-compilation-jar.jar \
SELECT distinct DateMutation, NVoie, IndVoie, Voie, Valeur, CodeTypeLocal,TypeLocal, Commune FROM mutations WHERE (Commune = 'ICI') and (Valeur > 100000) and (CodeTypeLocal in (1, 2)) order by Valeur desc

Поможет ли это вашемупрецедент или вам нужно, чтобы он был в другом формате?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...