小编Ste*_*eve的帖子

Pyspark:将多个数组列拆分为行

我有一个数据框,有一行和几列.一些列是单个值,其他列是列表.所有列表列的长度都相同.我想将每个列表列拆分为一个单独的行,同时保持任何非列表列不变.

样本DF:

from pyspark import Row
from pyspark.sql import SQLContext
from pyspark.sql.functions import explode

sqlc = SQLContext(sc)

df = sqlc.createDataFrame([Row(a=1, b=[1,2,3],c=[7,8,9], d='foo')])
# +---+---------+---------+---+
# |  a|        b|        c|  d|
# +---+---------+---------+---+
# |  1|[1, 2, 3]|[7, 8, 9]|foo|
# +---+---------+---------+---+
Run Code Online (Sandbox Code Playgroud)

我想要的是:

+---+---+----+------+
|  a|  b|  c |    d |
+---+---+----+------+
|  1|  1|  7 |  foo |
|  1|  2|  8 |  foo |
|  1|  3|  9 |  foo |
+---+---+----+------+
Run Code Online (Sandbox Code Playgroud)

如果我只有一个列表列,只需执行以下操作即可explode:

df_exploded = df.withColumn('b', explode('b')) …
Run Code Online (Sandbox Code Playgroud)

python dataframe apache-spark apache-spark-sql pyspark

50
推荐指数
3
解决办法
3万
查看次数

Pyspark:解析一列json字符串

我有一个pyspark数据框,由一列调用json,其中每一行都是一个json的unicode字符串.我想解析每一行并返回一个新的数据帧,其中每一行都是解析的json.

# Sample Data Frame
jstr1 = u'{"header":{"id":12345,"foo":"bar"},"body":{"id":111000,"name":"foobar","sub_json":{"id":54321,"sub_sub_json":{"col1":20,"col2":"somethong"}}}}'
jstr2 = u'{"header":{"id":12346,"foo":"baz"},"body":{"id":111002,"name":"barfoo","sub_json":{"id":23456,"sub_sub_json":{"col1":30,"col2":"something else"}}}}'
jstr3 = u'{"header":{"id":43256,"foo":"foobaz"},"body":{"id":20192,"name":"bazbar","sub_json":{"id":39283,"sub_sub_json":{"col1":50,"col2":"another thing"}}}}'
df = sql_context.createDataFrame([Row(json=jstr1),Row(json=jstr2),Row(json=jstr3)])
Run Code Online (Sandbox Code Playgroud)

我已尝试使用以下方法映射每一行json.loads:

(df
  .select('json')
  .rdd
  .map(lambda x: json.loads(x))
  .toDF()
).show()
Run Code Online (Sandbox Code Playgroud)

但这会返回一个 TypeError: expected string or buffer

我怀疑问题的一部分是,当从a转换为a dataframerdd,架构信息会丢失,所以我也尝试手动输入架构信息:

schema = StructType([StructField('json', StringType(), True)])
rdd = (df
  .select('json')
  .rdd
  .map(lambda x: json.loads(x))
)
new_df = sql_context.createDataFrame(rdd, schema)
new_df.show()
Run Code Online (Sandbox Code Playgroud)

但我也是这样TypeError.

看看这个答案,看起来平坦化行flatMap可能在这里很有用,但我也没有成功:

schema = StructType([StructField('json', StringType(), True)])
rdd = (df
  .select('json')
  .rdd …
Run Code Online (Sandbox Code Playgroud)

python json apache-spark pyspark

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

Python logging.getLogger 在 AWS Glue python shell 作业中不起作用

我正在尝试使用 Python 的logging模块为我的 AWS Glue 作业设置记录器。我有一个使用 Python 版本 3 的类型为“Python Shell”的 Glue 作业。

如果我不带任何实例化记录器name,日志记录工作正常,但是如果我给我的记录器一个name,它不再工作,并且我收到一个错误消息:Log stream not found.

我在示例 Glue 作业中有以下代码:

import sys
import logging

# Version 1 - this works fine
logger = logging.getLogger()
log_format = "[%(asctime)s %(levelname)-8s %(message)s"

# Version 2 - this fails
logger = logging.getLogger(name = "foobar")
log_format = "[%(name)s] %(asctime)s %(levelname)-8s %(message)s"

date_format = "%a, %d %b %Y %H:%M:%S %Z"
log_stream = sys.stdout
if logger.handlers:
  for handler in …
Run Code Online (Sandbox Code Playgroud)

python logging amazon-web-services aws-glue

6
推荐指数
2
解决办法
3330
查看次数

Pyspark:从 pyspark 数据帧中删除 UTF 空字符

我有一个类似于以下内容的 pyspark 数据框:

df = sql_context.createDataFrame([
  Row(a=3, b=[4,5,6],c=[10,11,12], d='bar', e='utf friendly'),
  Row(a=2, b=[1,2,3],c=[7,8,9], d='foo', e=u'ab\u0000the')
  ])
Run Code Online (Sandbox Code Playgroud)

其中列的值之一e包含 UTF 空字符\u0000。如果我尝试将其加载df到 postgresql 数据库中,则会收到以下错误:

ERROR: invalid byte sequence for encoding "UTF8": 0x00 
Run Code Online (Sandbox Code Playgroud)

这是有道理的。在将数据加载到 postgres 之前,如何有效地从 pyspark 数据框中删除空字符?

我尝试pyspark.sql.functions先使用其中一些来清理数据,但没有成功。encodedecode、 并regex_replace没有起作用:

df.select(regexp_replace(col('e'), u'\u0000', ''))
df.select(encode(col('e'), 'UTF-8'))
df.select(decode(col('e'), 'UTF-8'))
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想清理整个数据框,而不具体指定哪些列或违规字符是什么,因为我不一定提前知道这些信息。

我正在使用带编码的 postgres 9.4.9 数据库UTF8

python postgresql utf-8 apache-spark pyspark

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

使用公式生成超链接时,VBA打开Excel超链接不起作用

使用公式生成的Excel超链接似乎存在错误.我正在使用Excel 2010.我有一个包含URL的单元格的电子表格,我的目标是执行以下两项操作:

  1. 将这些单元格转换为超链接.
  2. 创建一个键盘快捷方式来打开这些超链接,这样我就不必使用鼠标了.

做#1,最初我只是使用了这个功能=HYPERLINK().所以,我的网址在列中A,我使用这个公式在列中创建超链接B.

为了做#2,我创建了以下宏,它应该用键盘快捷键Ctrl+ 打开超链接H:

Sub Open_Hyperlink()
'
' Open_Hyperlink Macro
'
' Keyboard Shortcut: Ctrl+h
'
    Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
End Sub
Run Code Online (Sandbox Code Playgroud)

问题是这个宏似乎只适用于不使用公式创建的超链接.例如,如果我只是键入一个单元格http://www.google.com,Excel将自动使这个超链接和键盘快捷方式宏工作,其中它不与公式生成的超链接.

我还注意到,当我右键单击公式生成的超链接时,下拉菜单中没有选项可以打开超链接,但右键单击非公式生成的超链接时有选项.

我发现了以下解决方法.我没有使用公式生成超链接,而是使用了我在这里找到的宏.

Sub HyperAdd()

'Converts each text hyperlink selected into a working hyperlink

For Each xCell In Selection
    ActiveSheet.Hyperlinks.Add Anchor:=xCell, Address:=xCell.Formula
Next xCell

End Sub
Run Code Online (Sandbox Code Playgroud)

我可以使用键盘快捷键打开使用此宏生成的超链接.我想知道是否有人有或有类似的问题,为什么公式生成的超链接不适合我.我希望将来使用公式来制作超链接,因为它更简单,所以如果有人知道避免使用宏来制作超链接的方法,我真的很感激.

excel vba formula hyperlink excel-vba

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