Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 Spark-write Avro文件_Apache Spark_Avro - Fatal编程技术网

Apache spark Spark-write Avro文件

Apache spark Spark-write Avro文件,apache-spark,avro,Apache Spark,Avro,在如下流程中使用Spark(使用Scala API)编写Avro文件的常见做法是: 从HDFS解析一些日志文件 对于每个日志文件,应用一些业务逻辑并生成Avro文件(或者可能合并多个文件) 将Avro文件写入HDFS 我试着使用spark avro,但没有多大帮助 val someLogs = sc.textFile(inputPath) val rowRDD = someLogs.map { line => createRow(...) } val sqlContext = ne

在如下流程中使用Spark(使用Scala API)编写Avro文件的常见做法是:

  • 从HDFS解析一些日志文件
  • 对于每个日志文件,应用一些业务逻辑并生成Avro文件(或者可能合并多个文件)
  • 将Avro文件写入HDFS
  • 我试着使用spark avro,但没有多大帮助

    val someLogs = sc.textFile(inputPath)
    
    val rowRDD = someLogs.map { line =>
      createRow(...)
    }
    
    val sqlContext = new SQLContext(sc)
    val dataFrame = sqlContext.createDataFrame(rowRDD, schema)
    dataFrame.write.avro(outputPath)
    
    此操作失败并出现错误:

    org.apache.spark.sql.AnalysisException: 
          Reference 'StringField' is ambiguous, could be: StringField#0, StringField#1, StringField#2, StringField#3, ...
    

    Databricks提供了spark avro库,帮助我们读取和写入avro数据

    dataframe.write.format("com.databricks.spark.avro").save(outputPath)
    

    您需要启动spark shell以包含avro软件包。建议用于较低版本

    $SPARK_HOME/bin/SPARK shell——软件包com.databricks:SPARK-avro_2.11:4.0.0

    然后使用df作为avro文件写入-

    dataframe.write.format("com.databricks.spark.avro").save(outputPath)
    
    并在hive中以avro表的形式写入-

    dataframe.write.format("com.databricks.spark.avro").saveAsTable(hivedb.hivetable_avro)
    

    Spark 2和Scala 2.11

    import com.databricks.spark.avro._
    import org.apache.spark.sql.SparkSession
    
    val spark = SparkSession.builder().master("local").getOrCreate()
    
    // Do all your operations and save it on your Dataframe say (dataFrame)
    
    dataFrame.write.avro("/tmp/output")
    
    Maven依赖关系

    <dependency>
        <groupId>com.databricks</groupId>
        <artifactId>spark-avro_2.11</artifactId>
        <version>4.0.0</version> 
    </dependency>
    
    
    com.databricks
    spark-avro_2.11
    4.0.0 
    
    您能更具体一点吗?例如,为什么'spark avro'不适合您?我没有成功地将avro生成的java代码与spark avro一起使用。另外,当我使用模式API时,我会遇到这样的错误:org.apache.spark.sql.AnalysisException:Reference'StringField'不明确,可能是:StringField#0、StringField#1、StringField#2、StringField#3、@d4rkang3l您确定问题出在avro序列化上吗?数据帧生成是否没有问题?在Java 8中:df2.write().format(“com.databricks.spark.avro”).mode(SaveMode.Overwrite).save(f.getOutputPath());我怀疑。avro(“/tmp/output”)是否有效。我认为应该使用这种方法:write.format(“avro”).save(/output/path)Paul“append”的语法对于表来说,我似乎无法得到正确的结果。您能否验证是否可能以及如何验证?“.saveAsTable(hivedb.hivetable_avro)”部分将出现以下警告问题:WARN hive.HiveExternalCatalog:找不到数据源提供程序com.databricks.spark.avro的对应配置单元服务器。将数据源表
    dbName.Suchas.hivedb
    tableName.Suchas.hivetable_avro
    以Spark SQL特定格式持久化到配置单元元存储中,该格式与配置单元不兼容。至少spark2是这样的