我们可以编写 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 通用动态编写的代码吗的主要内容,如果未能解决你的问题,请参考以下文章