如何在Spark Scala中将架构从另一个文件添加到文件

时间:2019-01-18 12:18:49

标签: sql scala apache-spark hadoop

我正在Spark中使用Scala

我有两个csv文件,一个具有列名,另一个具有数据,我如何集成这两个文件,以便可以使用模式和数据生成结果文件,然后必须对该文件应用操作,例如groupby,cout等,因为我需要计算这些列中的不同值。

任何人都可以帮忙在这里会很有帮助

我写了下面的代码,读取它们后,两个文件都从两个文件中分离出来,这比我现在使用union加入两个DF时如何将第一行作为模式或其他任何方式进行。任何人都可以建议。

     val sparkConf = new SparkConf().setMaster("local[4]").setAppName("hbase sql")
val sc = new SparkContext(sparkConf)
val spark1 = SparkSession.builder().config(sc.getConf).getOrCreate()
    val sqlContext = spark1.sqlContext

val spark = SparkSession
  .builder
  .appName("SparkSQL")
  .master("local[*]")
  .getOrCreate()
import spark.implicits._
val lines = spark1.sparkContext.textFile("C:/Users/ayushgup/Downloads/home_data_usage_2018122723_1372672.csv").map(lines=>lines.split("""\|""")).toDF()  
 val header = spark1.sparkContext.textFile("C:/Users/ayushgup/Downloads/Header.csv").map(lin=>lin.split("""\|""")).toDF()

val file = header.unionAll(lines).toDF()

1 个答案:

答案 0 :(得分:1)

spark.sparkContext.textFile()将返回rdd并且不会推断模式,即使您在rdd顶部执行.toDF()

sc.textFile()用于读取非结构化文本文件。您应该使用

spark.read.format("csv").option("header",true").option("inferSchema","true").load("..path.to.csv")

从标题中获取模式。

最好将cat文件一起在一起,创建一个新的csv并在HDFS中读取它们

cat header.csv home_data_usage_2018122723_1372672.csv >> new_home_data_usage.csv

然后

hadoop fs -copyFromLocal new_home_data_usage.csv <hdfs_path>

然后使用

spark.read.format("csv").option("header",true").option("inferSchema","true").load("..path.to.csv")