scala - 从spark中的json模式动态生成df.select语句

标签 scala apache-spark hadoop bigdata

我正在从宽字符串中选择列,其偏移量如下所示

df2 = df.select( substring(col("a"), 4, 6).as("c")).cast(IntegerType)

但是我必须从字符串中提取1000列,如果我可以提供诸如列名、数据类型、宽度、起始位置和结束位置等详细信息,那么如何使用json sparkstruct模式生成select语句。
另外,我不得不将一些列转换为intergertype或longtype,但是我观察到这些字段被像
111111111将在转换为integertype时转换为1

最佳答案

如果可以使用configfactory将json转换为字符串
这只是一个三步的过程

val config = ConfigFactory.parseFile(new File(configFile))
val jsonColumns = config.getString("name.location")
val jsonColumnsArr = jsonColumns.split(",")
val mappedColNames = jsonColumnsArr.map(name => col(name))
df.select(mappedColNames: _*)

注:
1:configfile可以是从参数中获取的字符串
2:name和location是指向列名的json对象

关于scala - 从spark中的json模式动态生成df.select语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52597463/

相关文章:

Scala 2.8 TreeMap 和自定义排序

hadoop - 将 Hadoop+Hive 与 AWS EMR 上的 MongoDB 连接(找不到类 com/mongodb/DBObject)

hadoop - 调用getSplit hadoop 2.0.0-cdh4.0.0时出现IncompatibleClassChangeError

scala - 无法从 JAR 文件加载主类

eclipse - 尝试在 Eclipse 中运行 Scala 应用程序时出错

scala - 无法从 HDFS 读取文件

java - Spark Java saveAsTable 因 ArrayIndexOutOfBoundsException 而失败

java - bash: 导出: `“JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home” ': 不是有效的标识符

scala - 更改在端口 7077 上运行的绑定(bind) IP - Apache Spark

c# - 为什么LINQ操作会丢失集合的静态类型?