我将火花数据框保存为拼花文件,数据框具有从avro对象构建的行。相同的确切html" target="_blank">代码在这里-https://stackoverflow.com/a/41491999/2440775
我面临的挑战是,我希望能够在传入数据中缺少整数字段时具有空值。Avro似乎允许使用Union类型,但当我不指定默认值或在avsc中指定默认值为"null"时,我会得到以下错误:
Caused by: org.apache.avro.AvroRuntimeException: Field xxx type:LONG pos:7 not set and has no default value
at org.apache.avro.generic.GenericData.getDefaultValue(GenericData.java:984)
at org.apache.avro.data.RecordBuilderBase.defaultValue(RecordBuilderBase.java:135)
Or
Caused by: org.apache.avro.AvroRuntimeException: Field xxx type:UNION pos:7 not set and has no default value
at org.apache.avro.generic.GenericData.getDefaultValue(GenericData.java:984)
at org.apache.avro.data.RecordBuilderBase.defaultValue(RecordBuilderBase.java:135)
如果我写一个默认值“0”,那么it saveAspQuet工作得很好
我还尝试更改avro规范,使其首先具有“null”类型,因为union选择了第一个元素的类型。
"type": ["null","long"], "default": null
这会导致以下异常:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost): java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
在avro模式中更改long和null的顺序会导致以下异常
引起原因:org.apache.avro.AvroTypeExc0019:非数值默认值为long:null
我没有这样的解决方案,但找到了一个解决方法。我从avro对象构建行的方式是从avro对象创建一个列表,然后执行一行。关于那件事。解决方法检查默认值0和数据类型int或long。如果是默认值,则添加null。因此,在选择默认值时必须小心。
public static List avroToList(AvroData a) throws UnsupportedEncodingException{
List l = new ArrayList<>();
for (Schema.Field f : a.getSchema().getFields()) {
Object value = a.get(f.name());
if (value == null) {
l.add(null);
}
else {
switch (f.schema().getType().getName()){
case "union":
l.add(value.toString());
break;
case "int":
if(value == 0) {l.add(null);}
else {l.add(Integer.valueOf(value.toString()));}
break;
case "long":
if(value == 0L) {l.add(null);}
else {l.add(Long.valueOf(value.toString()));}
break;
default:l.add(value);
break;
}
}
}
return l;
}
avsc文件的类型信息如下
"type": "long", "default": 0
我是大数据生态系统的新手,有点起步。 我读过几篇关于使用spark流媒体阅读Kafka主题的文章,但我想知道是否可以使用spark作业而不是流媒体阅读Kafka主题?如果是的话,你们能帮我指出一些可以让我开始学习的文章或代码片段吗。 问题的第二部分是以拼花格式向hdfs写信。一旦我读了Kafka的书,我想我会有一个rdd。将此rdd转换为数据帧,然后将数据帧写入拼花文件。这是正确的方法吗。 感谢您
Spark版本:2.3 hadoop dist:azure Hdinsight 2.6.5平台:azure存储:BLOB 集群中的节点:6个执行器实例:每个执行器6个内核:每个执行器3个内存:8gb 试图通过同一存储帐户上的spark数据框将azure blob(wasb)中的csv文件(大小4.5g-280列,2.8 mil行)加载到拼花格式。我重新划分了大小不同的文件,即20、40、60、10
如果我写信 临时工。拼花文件夹我得到了和行号相同的文件号 我想我不太了解拼花地板,但它是自然的吗?
由于,我检查了一个spark作业的输出拼花文件,该作业总是会发出声音。我在Cloudera 5.13.1上使用了 我注意到拼花地板排的大小是不均匀的。第一排和最后一排的人很多。剩下的真的很小。。。 拼花地板工具的缩短输出,: 这是已知的臭虫吗?如何在Spark中设置拼花地板块大小(行组大小)? 编辑: Spark应用程序的作用是:它读取一个大的AVRO文件,然后通过两个分区键(使用
如何将数据帧中的数据写入到单个。拼花地板文件(两个数据 df.rdd.get1个分区 1个 如果我使用上述命令在HDFS中创建拼花文件,它将在HDFS中创建目录“payloads.parquet”,并在该目录中创建多个文件。拼花地板文件,元数据文件正在保存。 找到4项 如何将数据帧中的数据写入单个文件(两个数据 帮助将不胜感激。
我是Spark的初学者,试图理解Spark数据帧的机制。当从csv和parquet加载数据时,我比较了spark sql dataframe上sql查询的性能。我的理解是,一旦数据加载到spark数据框中,数据的来源(csv或parquet)应该无关紧要。然而,我看到了两者之间的显著性能差异。我使用以下命令加载数据,并对其编写查询。 请解释差异的原因。