Apache spark Scala Spark:找到多个json源
我在hadoop集群上执行Apache spark Scala Spark:找到多个json源,apache-spark,hadoop,apache-spark-sql,Apache Spark,Hadoop,Apache Spark Sql,我在hadoop集群上执行spark2 submit时遇到异常,在hdfs中读取.jsons目录时,我不知道如何解决它 我在几块黑板上发现了一些关于这个问题的问题,但没有一个是受欢迎的,也没有一个答案 我尝试显式导入org.apache.spark.sql.execution.datasources.json.JsonFileFormat,但导入SparkSession似乎是多余的,因此无法识别 但是,我可以确认这两个课程都是可用的 val-json:org.apache.spark.sql.e
spark2 submit
时遇到异常,在hdfs中读取.jsons
目录时,我不知道如何解决它
我在几块黑板上发现了一些关于这个问题的问题,但没有一个是受欢迎的,也没有一个答案
我尝试显式导入org.apache.spark.sql.execution.datasources.json.JsonFileFormat
,但导入SparkSession
似乎是多余的,因此无法识别
但是,我可以确认这两个课程都是可用的
val-json:org.apache.spark.sql.execution.datasources.json.JsonDataSource
val json:org.apache.spark.sql.execution.datasources.json.JsonFileFormat
堆栈跟踪:
线程“main”org.apache.spark.sql.AnalysisException中的异常:找到多个json源(org.apache.spark.sql.execution.datasources.json.JsonFileFormat,org.apache.spark.sql.execution.datasources.json.DefaultSource),请指定完全限定的类名。;
位于org.apache.spark.sql.execution.datasources.DataSource$.lookUpdateSource(DataSource.scala:670)
位于org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:190)
位于org.apache.spark.sql.DataFrameReader.json(DataFrameReader.scala:397)
位于org.apache.spark.sql.DataFrameReader.json(DataFrameReader.scala:340)
位于jsonData.HdfsReader$.readJsonToDataFrame(HdfsReader.scala:45)
位于jsonData.HdfsReader$.process(HdfsReader.scala:52)
在exp03HDFS.StartExperiment03$.main(StartExperiment03.scala:41)
在exp03HDFS.startexperioment03.main(startexperioment03.scala)处
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
位于org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:894)
位于org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:198)
位于org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:228)
位于org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:137)
位于org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
HdfsReader:
导入java.net.URI
导入org.apache.hadoop.fs.{LocatedFileStatus,RemoteIterator}
导入org.apache.spark.sql.DataFrame
导入org.apache.spark.sql.SparkSession
导入管道.ContentPipeline
对象HdfsReader{
...
def readJsonToDataFrame(inputDir:String,多行:Boolean=true,详细:Boolean=false)
:数据帧={
val multiline_df=spark.read.option(“multiline”,value=true).json(inputDir)
多行测向显示(假)
if(详细)多行函数显示(truncate=true)
多行测向
}
def进程(路径:URI)={
val dataFrame=readJsonToDataFrame(path.toString,verbose=true)
val contentDataFrame=ContentPipeline.getContentOfText(dataFrame)
val newDataFrame=dataFrame.join(contentDataFrame,“text”).distinct()
saveAsJson(newDataFrame,outputFolder)
}
}
构建.sbt
版本:=“0.1”
scalaVersion:=“2.11.8”//与hadoop使用的版本相同
libraryDependencies++=Seq(
“org.apache.spark”%%“spark核心”%%“2.3.0”//hadoop使用的版本相同
“com.johnsnowlabs.nlp”%%“spark nlp”%%“2.3.0”,
“org.apache.spark”%%“spark sql”%%“2.3.0”,
“org.apache.spark”%%“spark mllib”%%“2.3.0”,
“org.scalactic”%%“scalactic”%%“3.2.0”,
“org.scalatest”%%“scalatest”%%“3.2.0”%%“测试”,
“com.lihaoyi”%%“upickle”%%“0.7.1”)
类路径中似乎同时有Spark 2.x和3.x JAR。根据sbt文件,应该使用Spark 2.x,但是,Spark 3.x中添加了,似乎类路径中同时包含Spark 2.x和3.x jar。根据sbt文件,应该使用Spark 2.x,但是,Spark 3.x中添加了,因此,我解决了我的问题:
val dataFrame1=spark
阅读
.选项(“多行”,值=真)
.json(inputDir)
val dataFrame2=spark
阅读
.format(“org.apache.spark.sql.execution.datasources.json.JsonFileFormat”)
.选项(“多行”,值=真)
.load(inputDir)
这两个功能基本相同:
他们将整个目录的*.json
文件读取到一个数据帧中
唯一不同的是,dataFrame1
对要使用的数据类型进行假设,并在org.apache.spark.sql.execution.datasources.json
中查找它
您不希望这样,因为如果您尝试从这个类路径初始化json,您将发现两个源代码
val-json:org.apache.spark.sql.execution.datasources.json.JsonDataSource
val json:org.apache.spark.sql.execution.datasources.json.JsonFileFormat
但是,存在允许您在发生冲突时指定源的
这就是使用
格式(源).read(路径)
显式使用特定数据类型读取文件的地方。因此,我解决了我的问题:
val dataFrame1=spark
阅读
.选项(“多行”,值=真)
.json(inputDir)
val dataFrame2=spark
阅读
.format(“org.apache.spark.sql.execution.datasources.json.JsonFileFormat”)
.选项(“多行”,值=真)
.load(inputDir)
这两个功能基本相同:
他们将整个目录的*.json
文件读取到一个数据帧中
唯一不同的是,dataFrame1
对要使用的数据类型进行假设,并在org.apache.spark.sql.execution.datasources.json
中查找它
你不想这样,因为如果你尝试