Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Scala Spark:找到多个json源_Apache Spark_Hadoop_Apache Spark Sql - Fatal编程技术网

Apache spark Scala Spark:找到多个json源

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

我在hadoop集群上执行
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
中查找它

你不想这样,因为如果你尝试