Spark SQL报错:value as is not a member of object Hotel 求助
问题解决方法
错误原因
Hotel是你定义的Case Class的伴生对象,并非Spark的DataFrame/Dataset实例,而as是DataFrame/Dataset专属方法,因此直接调用Hotel.as("Hoteles")会触发value as is not a member of object Hotel错误。必须先将CSV数据加载为Spark可操作的DataFrame/Dataset实例,再执行后续筛选、查询逻辑。
正确实现方案
方案1:直接使用DataFrame API处理
无需依赖Case Class,直接读取CSV并完成筛选:
// 读取CSV文件,根据你的实际路径和格式调整参数 val hotelsDF = spark.read .option("header", "true") // 若CSV首行是表头则开启 .option("inferSchema", "true") // 自动推断字段数据类型 .csv("/your/hotel/data/path.csv") // 筛选西班牙酒店,选择需要展示的字段(cc1作为国家信息) val hotelsSpain = hotelsDF .where($"cc1" === "es") // Spark DataFrame筛选需用===而非Scala的== .select("id", "name", "cc1") display(hotelsSpain)
方案2:结合Case Class使用Dataset API
因Case Class的city_preferred字段与CSV的city_hotel名称不匹配,需先做字段映射:
// 读取CSV为DataFrame val hotelsDF = spark.read .option("header", "true") .option("inferSchema", "true") .csv("/your/hotel/data/path.csv") // 重命名字段以匹配Case Class,再转换为Dataset[Hotel] val hotelsDS = hotelsDF .withColumnRenamed("city_hotel", "city_preferred") .as[Hotel] // 筛选西班牙酒店并选择目标字段 val hotelsSpain = hotelsDS .filter(_.cc1 == "es") // 操作Dataset时可直接用Scala的==访问Case Class属性 .select("id", "name", "cc1") display(hotelsSpain)
核心注意事项
- 禁止直接调用Case Class对象的Spark方法,必须先加载数据得到DataFrame/Dataset实例。
- Spark DataFrame筛选条件用
===,Dataset筛选可直接用Scala的==操作Case Class属性。 - 确保CSV字段与Case Class字段名称匹配,不一致时用
withColumnRenamed调整映射关系。
内容的提问来源于stack exchange,提问作者David Vazquez
相关产品推荐
相关产品推荐

