scala - Spark 在 .jar 文件中使用 dbutils.fs.ls().toDF
问题描述
我正在尝试根据数据块笔记本中的代码打包我的 jar。
我有以下行在databricks中有效,但在scala代码中引发错误:
import com.databricks.dbutils_v1.DBUtilsHolder.dbutils
val spark = SparkSession
.builder()
.appName("myApp")
.master("local")
.enableHiveSupport()
.getOrCreate()
val sc = SparkContext.getOrCreate()
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import spark.implicits._
import sqlContext.implicits._
...
var file_details = dbutils.fs.ls(folder_path2).toDF()
这给出了错误:
error: value toDF is not a member of Seq[com.databricks.backend.daemon.dbutils.FileInfo]
有谁知道如何dbutils.fs.ls().toDF()
在 Scala .jar 中使用?
编辑:我为 pyspark发现了一个类似的问题,我正在尝试将其翻译为 Scala:
val dbutils = com.databricks.service.DBUtils
val ddlSchema = new ArrayType(
new StructType()
.add("path",StringType)
.add("name",StringType)
.add("size",IntegerType)
, true)
var folder_path = "abfss://container@storage.dfs.core.windows.net"
var file_details = dbutils.fs.ls(folder_path)
var df = spark.createDataFrame(sc.parallelize(file_details),ddlSchema)
但我收到此错误:
error: overloaded method value createDataFrame with alternatives:
(data: java.util.List[_],beanClass: Class[_])org.apache.spark.sql.DataFrame <and>
(rdd: org.apache.spark.api.java.JavaRDD[_],beanClass: Class[_])org.apache.spark.sql.DataFrame <and>
(rdd: org.apache.spark.rdd.RDD[_],beanClass: Class[_])org.apache.spark.sql.DataFrame <and>
(rows: java.util.List[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType)org.apache.spark.sql.DataFrame <and>
(rowRDD: org.apache.spark.api.java.JavaRDD[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType)org.apache.spark.sql.DataFrame <and>
(rowRDD: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row],schema: org.apache.spark.sql.types.StructType)org.apache.spark.sql.DataFrame
cannot be applied to (org.apache.spark.rdd.RDD[com.databricks.service.FileInfo], org.apache.spark.sql.types.ArrayType)
var df = spark.createDataFrame(sc.parallelize(file_details),ddlSchema)
解决方案
为了触发隐式转换为类似容器的数据集然后toDF()
可用,您还需要一个隐式 spark 编码器(除了已经存在的spark.implicits._
)
我认为这种自动推导将起作用并将toDF()
提供:
val implicit encoder = org.apache.spark.sql.Encoders.product[com.databricks.backend.daemon.dbutils.FileInfo]
否则,是的,您可以直接使用 RDD。
推荐阅读
- c# - 使用参数中的日期从 c# 调用存储过程
- amazon-s3 - Amazon S3 的端点是什么?
- ios - 如何根据 UITableViewCell 中的内容调整水平 UICollectionView 的高度
- r - 在 Azure Data Lake Analytics 中安装 R 包
- javascript - 需要将我的供应商 ID 分配给 InvoiceTable - 一对多关系
- angular - 图像未在 Angular 应用程序上加载
- c# - 使用实体框架从数据库中获取行到列表
- sql - 如何使用自定义维度作为唯一标识符连接 BigQuery 中的表
- mysql - Galera mysql集群无法在Kubernetes中启动
- c++ - 在 C++ 中使用 gRPC 时未解析的外部符号