小编Len*_* D.的帖子

无法在 Spark DataFrame 中按 MapType 列分组

我目前的问题是以下一个...

Exception in thread "main" org.apache.spark.sql.AnalysisException: expression 'mapField' cannot be used as a grouping expression because its data type map<string,string> is not an orderable data type.;;

我想要实现的只是基本上按给定的一组列对 DataFrame 中的条目进行分组,但是在与前面提到的 MapType 列分组时似乎失败了。

  .groupBy(
    ...
    "mapField",
    ...
  )
Run Code Online (Sandbox Code Playgroud)

我有一些想法,但必须有一种更简单的方法来解决这个问题,而不是我想过的以下方法......

  • 我已经得到了保存在 DF 中的连接字符串中的每个元素的键值,所以我可以将它们解析为 Map 然后使用 保存它withColumn,但还没有找到任何方法,我无法得到我的工作。这样做合理吗?

  • 重新解析为 RDD 并将其分组,然后返回 DF(我认为太麻烦了)

编辑

示例输入

   id    |  myMap
'sample' |  Map('a' -> 1, 'b' -> 2, 'c' -> 3)
Run Code Online (Sandbox Code Playgroud)

期望输出

   id    |  a  |  b  |  c
'sample' |  1  |  2  |  3
Run Code Online (Sandbox Code Playgroud)

scala apache-spark

5
推荐指数
1
解决办法
1032
查看次数

Python3 相对导入在包中失败

我一直在阅读大量与此事相关的问题,但到目前为止没有一个对我有帮助。我目前正在使用 Pythonclick库将脚本作为命令执行。

我正在尝试执行的当前命令放置在具有__main__.py文件的 Python 包中,就像父目录一样。当前的项目结构如下。

/myproject
   /foo_one
       __init__.py
       foo_one.py
    /foo_two
       __init__.py
       foo_two.py
    /foo_three
       __init__.py
       foo_three.py
    /foo_four
       __init__.py
       foo_four.py
    /foo_five
       __init__.py
       foo_five.py
    /foo_six
       __init__.py
       foo_six.py
    __init__.py
    __main__.py
    foo_seven.py
Run Code Online (Sandbox Code Playgroud)

每当我尝试运行__main__.py位于项目文件夹中的脚本时,都会出现以下错误。

ModuleNotFoundError: No module named '__main__.foo_two'; '__main__' is not a package

但是,如果我尝试使用这样的-m选项从上面的文件夹中执行相同的脚本python3 myproject -m,则会显示以下内容。

ImportError: attempted relative import with no known parent package

__main__.py有2个进口这样的...的__init__.py是空的。

from .foo_two.foo_two import AClass, AnotherClass, OtherClass
from .foo_three.foo_three import AnotherClassMore
Run Code Online (Sandbox Code Playgroud)

更新:更正上一个命令中的语法错误,同时调用python -m myproject …

python python-3.x

4
推荐指数
1
解决办法
2万
查看次数

在S3中存储时正确的Parquet文件大小吗?

我一直在阅读有关该主题的几个问题,也阅读过几个论坛,在所有这些论坛中,他们似乎都提到从Spark生成的每个.parquet文件的大小应该为64MB或1GB,但仍然无法我想知道哪种情况属于每种文件大小,其背后的原因除了HDFS将它们分成64MB的块。

我当前的测试方案如下。

dataset
  .coalesce(n) # being 'n' 4 or 48 - reasons explained below.
  .write
  .mode(SaveMode.Append)
  .partitionBy(CONSTANTS)
  .option("basepath", outputPath)
  .parquet(outputPath)
Run Code Online (Sandbox Code Playgroud)

我目前总共处理2.5GB到3GB的每日数据,这些数据将被拆分并每年保存到每日存储桶中。的背后原因,“N”是4或48,只是出于测试目的,因为我知道我的测试集的提前大小,我尝试,我可以得到一些接近64MB或1GB。在获得需要保存的确切大小之前,我尚未实现用于缓冲所需数据的代码。

所以我的问题是

如果我不打算使用HDFS而是仅存储和检索S3的数据,是否应该考虑这个大小?

而且,如果我计划使用HDFS存储生成的.parquet文件,则最大每日数据集的最佳大小应该是10GB左右。

任何其他优化技巧将不胜感激!

hdfs apache-spark parquet

3
推荐指数
1
解决办法
1368
查看次数

标签 统计

apache-spark ×2

hdfs ×1

parquet ×1

python ×1

python-3.x ×1

scala ×1