我们可以编写 Scala/Spark 通用动态编写的代码吗

Posted

技术标签:

【中文标题】我们可以编写 Scala/Spark 通用动态编写的代码吗【英文标题】:Can we write Scala/Spark generic dynamically written code 【发布时间】:2018-10-17 16:02:51 【问题描述】:

我正在尝试创建可以读取具有不同列数的任何文件的 Spark Scala 代码。我可以动态编写 scala/spark 代码并编译和执行它吗?我真的需要SBT吗?什么是实现这一目标的完美方式。

当我使用 shell 脚本运行 scala 代码或 scalac code.scala 它说

hadoop@namenode1:/usr/local/scala/examples$ ./survey.sh 
/usr/local/scala/examples/./survey.sh:6: error: not found: value spark
val survey = spark.read.format("com.databricks.spark.csv").option("header","true").option("nullValue","NA").option("timestampFormat","yyyy-MM-dd'T'HH:mm:ss").option("mode","failfast").option("inferchema","true").load("/tmp/survey.csv")
             ^
/usr/local/scala/examples/./survey.sh:19: error: not found: type paste
:paste
 ^
/usr/local/scala/examples/./survey.sh:37: error: not found: value udf
val parseGenderUDF = udf( parseGender _ )
                     ^
three errors found

我想要类似的东西

使用shell脚本动态生成file.scala代码然后编译它 使用

scalac file.scala

然后执行它

scala file.scala

但这可能吗。 有什么办法。

hadoop@namenode1:/usr/local/spark/examples/src/main/scala/org/apache/spark/examples$ cat Survey.scala 
import org.apache.spark.sql.SparkSession

object Survey 
   def main(args: Array[String]) 
val spark= SparkSession.builder
  .master("local")
  .appName("Survey")
  .getOrCreate()

val survey = spark.read.format("com.databricks.spark.csv").option("header","true").option("nullValue","NA").option("timestampFormat","yyyy-MM-dd'T'HH:mm:ss").option("mode","failfast").option("inferchema","true").load("/tmp/survey.csv")
survey.show()


执行时出错

hadoop@namenode1:/usr/local/spark/examples/src/main/scala/org/apache/spark/examples$ scalac Survey.scala
    Survey.scala:1: error: object apache is not a member of package org
    import org.apache.spark.sql.SparkSession
               ^
    Survey.scala:5: error: not found: value SparkSession
    val spark= SparkSession.builder
               ^
    two errors found
    hadoop@namenode1:/usr/local/spark/examples/src/main/scala/org/apache/spark/examples$ 

【问题讨论】:

Spark : how to run spark file from spark shell 这是有效的,但在启动过程中需要时间 【参考方案1】:

要提交 Spark 作业,您必须使用 spark-submit 命令或在 spark-shell 中执行 scala 脚本。 Apache Livy 也提供了一个 REST API 来提交 Spark 作业。

【讨论】:

【参考方案2】:

您需要创建 sparkSession 示例:

import org.apache.spark.sql.SparkSession
val spark= SparkSession.builder
  .master("local")
  .appName("MYAPP")
  .getOrCreate()

val survey = spark.read.format("com.databricks.spark.csv").option("header","true").option("nullValue","NA").option("timestampFormat","yyyy-MM-dd'T'HH:mm:ss").option("mode","failfast").option("inferchema","true").load("/tmp/survey.csv")

//你需要的udf

import org.apache.spark.sql.functions._
val parseGenderUDF = udf( parseGender _ )

这对你有帮助

【讨论】:

我尝试了你所说的但失败了,我现在已经更新了它【参考方案3】:

I have found 替代方案(cricket-007)

spark-shell -i survey.scala

但这似乎需要时间来配置 spark-shell。

这不是我想要的

【讨论】:

以上是关于我们可以编写 Scala/Spark 通用动态编写的代码吗的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从 Scala(spark) 调用 python 函数

spark学习进度1

通用Mapper

Scala简介及基础语法

大数据学习之Scala语言基本语法学习36

在Scala spark中实现动态字符串插值?