用Java或scala将CSV转换为Avro文件

用Java或scala将CSV转换为Avro文件,java,scala,csv,avro,Java,Scala,Csv,Avro,是否有用于将CSV转换为Java或scala中的Avro文件的库 我试图用谷歌搜索它,但找不到它的任何库。通过谷歌搜索,我找到了这篇文章: 引述: 要使用Hive将csv数据转换为Avro数据,我们需要执行以下步骤: 创建存储为textfile的配置单元表,并指定csv分隔符 使用“加载数据”命令将csv文件加载到上表 使用AvroSerDe创建另一个配置单元表 使用“插入覆盖”命令将数据从以前的表插入新的Avro配置单元表 示例:使用csv(学生id、科目id、年级) 您可以通过以下方式轻松完

是否有用于将CSV转换为Java或scala中的Avro文件的库


我试图用谷歌搜索它,但找不到它的任何库。

通过谷歌搜索,我找到了这篇文章:

引述:

要使用Hive将csv数据转换为Avro数据,我们需要执行以下步骤:

  • 创建存储为textfile的配置单元表,并指定csv分隔符
  • 使用“加载数据”命令将csv文件加载到上表
  • 使用AvroSerDe创建另一个配置单元表
  • 使用“插入覆盖”命令将数据从以前的表插入新的Avro配置单元表
  • 示例:使用csv(学生id、科目id、年级)


    您可以通过以下方式轻松完成:

    • 使用OpenCSV库解析您的CSV()
    • 使用json智能库()输出Avro json(用于模式)
      • 您可以尝试这种方法(Spark 1.6)

        皮斯帕克

        file = sc.textFile("people.csv")
        df = file.map(lambda line: line.split(',')).toDF(['name','age'])
        
        >>> df.show()
        +-------+---+
        |   name|age|
        +-------+---+
        |Michael| 29|
        |   Andy| 30|
        | Justin| 19|
        +-------+---+
        
        df.write.format("com.databricks.spark.avro").save("peopleavro")
        
        Peopleavro

        {u'age': u' 29', u'name': u'Michael'}
        {u'age': u' 30', u'name': u'Andy'}
        {u'age': u' 19', u'name': u'Justin'}
        
        如果您需要维护数据类型,那么创建一个模式并传递它

        schema = StructType([StructField("name",StringType(),True),StructField("age",IntegerType(),True)])
        
        df = file.map(lambda line: line.split(',')).toDF(schema)
        >>> df.printSchema()
        root
         |-- name: string (nullable = true)
         |-- age: integer (nullable = true)
        
        现在你的avro

        {
          "type" : "record",
          "name" : "topLevelRecord",
          "fields" : [ {
            "name" : "name",
            "type" : [ "string", "null" ]
          }, {
            "name" : "age",
            "type" : [ "int", "null" ]
          } ]
        }
        

        为此,您可以使用spark或spark shell(带有选项:--packages org.apache.spark:spark avro…),如果这是一种特殊用法的话

        示例代码示例:

        val df=spark.read.csv(“example.csv”)
        
        df.write.format(“com.databricks.spark.avro”).save(“example.avro”)

        但它正在使用配置单元进行转换。我需要泛型,这样我们就可以使用anywhere csv模式来命名字段,而Avro也有类型。您希望如何生成Avro方案的类型?或者您是否有一个已知的用Java/Scala类表示的模式?假设您可能知道该模式。。。如果不是的话,我认为@Bala的答案应该是正确的,这可能也会有所帮助
        schema = StructType([StructField("name",StringType(),True),StructField("age",IntegerType(),True)])
        
        df = file.map(lambda line: line.split(',')).toDF(schema)
        >>> df.printSchema()
        root
         |-- name: string (nullable = true)
         |-- age: integer (nullable = true)
        
        {
          "type" : "record",
          "name" : "topLevelRecord",
          "fields" : [ {
            "name" : "name",
            "type" : [ "string", "null" ]
          }, {
            "name" : "age",
            "type" : [ "int", "null" ]
          } ]
        }