我很难从一个包含列名的arg和一个包含scala值的arg创建一个框架。
它无法识别spark. toDataFrame(dataClient).toDF(columns._*)
val dataClient = args(0).split(",").map(_.trim)
val column = args(1).split(",").map(_.trim)
val dataClient = Seq(dataClient)
val df: DataFrame = spark.createDataFrame(dataClient).toDF(columns. _*)
我能用另一种方式来做而不需要一个库吗?
记住我不能使用云,所以导入服务非常有限。
一种将列参数和另一个值参数转换为嵌套框架的方法
1条答案
按热度按时间0g0grzrc1#
根据Gaël J的评论,你的意思是在列中使用“.”。**,事实上你c+p'd看起来是这样的。语法是:**not ._*。
还有:
第1行将dataClient声明为Array[String],第3行尝试使用单个条目将dataClient重新声明为Seq[Array[String]]。声明列,然后使用列“% s”。
最后,DataFrame已经创建了一个DataFrame,所以toDF在这里没有意义。
目前还不清楚你想做什么,但这段代码,即使经过这些更正,但我认为它是这样的:
产生:
“import spark.implicits._”将调用DF所需的所有隐式机制带入范围,“.toSeq”允许该机制看到Seq[String]而不是Array[String],以便toDF可以工作。
其产生:
要做到这一点,需要直接生成行:
导致:
但有几件事你应该避免:
虽然不是Spark的“内部”,但绝对不是为了让你这样使用Spark。
如果这是一个学习经验,我建议制作一个csv文件并阅读,而不是试图构建这样的架构,如果不是,那么我建议您使用像parquet这样的文件交换,它包括架构,并且不会在您的领域中实际需要一个“,”(或|或任何你试图用作分隔符的东西)。如果它真的必须是文本,那么看看json,它也允许传入一些结构(尽管不是带有非字符串键的map)。