Scala 如何将一组输入文件(而不是目录)传递给spark作业,并在这些文件上创建数据帧
我想将一组avro文件作为输入传递给spark job,并在这些文件上创建dataframe。(我不想将文件放在目录中,并将目录作为输入传递) 在Spark shell中,我能够像下面这样成功地创建数据帧Scala 如何将一组输入文件(而不是目录)传递给spark作业,并在这些文件上创建数据帧,scala,dataframe,apache-spark,Scala,Dataframe,Apache Spark,我想将一组avro文件作为输入传递给spark job,并在这些文件上创建dataframe。(我不想将文件放在目录中,并将目录作为输入传递) 在Spark shell中,我能够像下面这样成功地创建数据帧 val DF = hiveContext.read.format("com.databricks.spark.avro").load("/data/year=2019/month=09/day=28/hour=01/data_1.1569650402704.avro","/data/year=
val DF = hiveContext.read.format("com.databricks.spark.avro").load("/data/year=2019/month=09/day=28/hour=01/data_1.1569650402704.avro","/data/year=2019/month=09/day=28/hour=01/data_2.1569650402353.avro")
但当我尝试运行spark submit命令时,同样失败
为了将avro文件独立地传递给spark作业,我尝试将avro文件放在文本文件中,并将此文件作为输入参数传递给驱动程序类
文本文件:
/data/year=2019/month=09/day=28/hour=01/data_1.1569650402704.avro
/data/year=2019/month=09/day=28/hour=01/data_2.1569650402353.avro
spark-submit --class Spark_submit_test --master yarn Spark_submit_test.jar textFile
=>这张照片
fileList : /data/ASDS/PNR/archive/year=2019/month=09/day=28/hour=01/data_1.1569650402704.avro,/data/ASDS/PNR/archive/year=2019/month=09/day=28/hour=01/data_2.1569650402353.avro
获取以下异常:
Exception in thread "main" java.io.FileNotFoundException: File hdfs://bdaolc01-ns/data/ASDS/PNR/archive/year=2019/month=09/day=28/hour=01/data_1.1569650402704.avro,/data/ASDS/PNR/archive/year=2019/month=09/day=28/hour=01/data_2.1569650402353.avro does not exist.
不知道如何避免“hdfs://bdaolc01-ns
“在开头追加。
如果我做错了,请纠正我,或者建议更好的方法来做同样的事情
注意:我尝试用双引号括起文件名,但没有用
预期结果:
Dataframe应该成功创建,df.printSchema应该列出avro文件的正确模式。您需要splat操作符 myList:_*
使用
--files
选项将输入文件路径传递给spark submit命令。还将输入文件名作为命令行参数传递。
这样我就可以在Drive类中读取文件
val avrofiles = Source.fromFile(inputFileName).getLines.toArray
并创建一个数据帧
val dF = hiveContext.read.format("com.databricks.spark.avro").load(avrofiles:_*)
嗨,安德鲁,谢谢你的回复。这个解决方案可能适用于spark 2,也适用于拼花地板。不幸的是,我们仍然使用spark 1.6。请您推荐任何解决方案w.r.t spark 1.6不幸的是,DataFrameReader上只有少数函数是varyargs
scala> val data = spark.read.parquet(paths: _*)
data: org.apache.spark.sql.DataFrame = [id: bigint, a: int ... 1 more field]
scala> val paths = List("/tmp/example-parquet/part-00000-38cd8823-bff7-46f0-82a0-13d1d00ecce5-c000.snappy.parquet")
paths: List[String] = List(/tmp/example-parquet/part-00000-38cd8823-bff7-46f0-82a0-13d1d00ecce5-c000.snappy.parquet)
scala> val data = spark.read.parquet(paths: _*)
data: org.apache.spark.sql.DataFrame = [id: bigint, a: int ... 1 more field]
scala> data.count
res0: Long = 12500000
val avrofiles = Source.fromFile(inputFileName).getLines.toArray
val dF = hiveContext.read.format("com.databricks.spark.avro").load(avrofiles:_*)