我有多个具有不同标题的csv。其中一些有12列,有些有14列,等等;它们的前6列都相同;列中的差异基于activityid-如果activityid为1,我们将有一个特定的标头,如果为2,我们将有不同的标头,依此类推。我有70多种活动类型;
我必须将所有这些组合成一个大的avro表,并按activityid进行分区; 但是我似乎无法做到这一点。
我采用的方法: 1)使用avro模式创建一个大型avro表,其中包含所有csv的所有不同列。前6列保持不变;
2)对于每个csv,使用推理模式创建一个数据框。将列转换为小写并删除所有空格(以使命名统一),并使用acivityid作为分区将其存储为avro
3)我的想法是,由于每个文件都有在avsc中定义的列,因此该表应使用其他列的空值自动将其选中-这是因为avro支持架构演变;这不起作用
4)我尝试使用列名插入到avro表中-类似于sql的insert into(cola,colb,colc)等效,从temp_view中选择a,b,c;这也不起作用;我们如何在sparksql中编写这样的语句?
我尝试了以下方法 对于(3) df.write.mode(“ append”)。format(“ com.databricks.spark.avro”)。option(“ header”,“ false”)。save(“ hdfspath”);
对于(4)sc.sparksql(s“插入large_avro_table(可乐,可乐,colc),从temp_table中选择可乐,可乐,colc”);
再次(4):df.select(colNames:_ *)。write.mode(“ append”)。insertInto(large_avro_table)