Spark Schema的simpleString()方法为何截断输出?
解决Spark Schema的simpleString()截断问题
方法一:调整Spark配置参数
Spark的simpleString()方法截断输出是因为默认限制了显示的字段总数,你可以通过设置spark.sql.debug.maxToStringFields配置项,将其值设为足够大的数值,就能避免截断。
修改你的SparkSession初始化代码,添加该配置:
SparkSession spark = SparkSession.builder() .config(new SparkConf() .setAppName("YourApp") .setMaster("local") .set("spark.sql.debug.maxToStringFields", "1000")) // 根据你的schema字段数设置更大值 .getOrCreate();
如果已经创建了SparkSession,也可以动态修改配置:
spark.conf().set("spark.sql.debug.maxToStringFields", "1000");
这个参数控制所有toString类方法(包括simpleString())中显示的最大字段数量,嵌套结构里的字段也会被计入总数,所以只要数值大于你的schema总字段数即可。
方法二:自定义工具方法生成完整Schema字符串
如果不想修改全局配置,也可以自己实现一个递归遍历Schema的方法,手动拼接出和simpleString()格式一致的完整字符串:
import org.apache.spark.sql.types.*; public class SchemaUtils { public static String fullSimpleString(DataType dataType) { if (dataType instanceof StructType) { StructType structType = (StructType) dataType; StringBuilder sb = new StringBuilder("struct<"); StructField[] fields = structType.fields(); for (int i = 0; i < fields.length; i++) { StructField field = fields[i]; sb.append(field.name()) .append(":") .append(fullSimpleString(field.dataType())); if (i != fields.length - 1) { sb.append(","); } } sb.append(">"); return sb.toString(); } else if (dataType instanceof ArrayType) { ArrayType arrayType = (ArrayType) dataType; return "array<" + fullSimpleString(arrayType.elementType()) + ">"; } else if (dataType instanceof MapType) { MapType mapType = (MapType) dataType; return "map<" + fullSimpleString(mapType.keyType()) + "," + fullSimpleString(mapType.valueType()) + ">"; } else { // 基础类型直接返回simpleString return dataType.simpleString(); } } }
使用时直接调用该方法:
String fullSchemaString = SchemaUtils.fullSimpleString(parquetData.schema());
内容的提问来源于stack exchange,提问作者Sam Comber
相关产品推荐
相关产品推荐

