我使用Spark 2.3.0。
以下代码片段在spark-shell
中正常工作:
def transform(df: DataFrame): DataFrame = {
df.select(
explode($"person").alias("p"),
$"history".alias("h"),
$"company_id".alias("id")
)
然而,当在Intellij中进行编辑时,它将无法识别select
,explode
和$
函数。这些是我在SBT中的依赖:
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies ++= {
val sparkVer = "2.1.0"
Seq(
"org.apache.spark" %% "spark-core" % sparkVer % "provided" withSources(),
"org.apache.spark" %% "spark-sql" % sparkVer % "provided" withSources()
)
}
有什么遗漏?导入语句或其他库?
答案 0 :(得分:2)
您应该使用transform
方法中的以下导入(以使explode
可用):
import org.apache.spark.sql.functions._
您还可以执行以下操作以准确导入您的内容。
import org.apache.spark.sql.functions.explode
它适用于spark-shell
,因为它默认导入(所以你不必担心这些简单的事情:))。
scala> spark.version
res0: String = 2.3.0
scala> :imports
1) import org.apache.spark.SparkContext._ (69 terms, 1 are implicit)
2) import spark.implicits._ (1 types, 67 terms, 37 are implicit)
3) import spark.sql (1 terms)
4) import org.apache.spark.sql.functions._ (354 terms)
至于$
,为了您的方便,它也会默认导入spark-shell
。添加以下内容以将其包含在您的方法中。
import spark.implicits._
根据您定义transform
方法的位置,您可以在transform
方法中添加隐式参数,如下所示(并跳过添加上面的import
):
def transform(df: DataFrame)(implicit spark: SparkSession): DataFrame = {
...
}
但我更喜欢使用绑定到输入数据框架的SparkSession
(这看起来更干净,更......极客:)。
def transform(df: DataFrame): DataFrame = {
import df.sparkSession.implicits._
...
}
作为奖励,我还要清理你的build.sbt
,所以它看起来如下:
libraryDependencies += "org.apache.spark" %% "spark-sql" % 2.1.0" % "provided" withSources()
您不会在Spark SQL应用程序中使用spark-core
中的工件(并且它是spark-sql
的传递依赖项)。
答案 1 :(得分:0)
Intellij没有可用的spark.implicits._库,因此爆炸引发错误。请记住在导入之前创建SparkSession.builder()对象。
应用以下代码,即可使用:
val spark = SparkSession.builder()
.master("local")
.appName("ReadDataFromTextFile")
.getOrCreate()
import spark.implicits._
val jsonFile = spark.read.option("multiLine", true).json("d:/jsons/rules_dimensions_v1.json")
jsonFile.printSchema()
//jsonFile.select("tag").select("name").show()
jsonFile.show()
val flattened = jsonFile.withColumn("tag", explode($"tag"))
flattened.show()